]> SALOME platform Git repositories - modules/eficas.git/commitdiff
Salome HOME
*** empty log message *** V12QT_070810
authorPascale Noyret <pascale.noyret@edf.fr>
Fri, 10 Aug 2007 14:05:03 +0000 (14:05 +0000)
committerPascale Noyret <pascale.noyret@edf.fr>
Fri, 10 Aug 2007 14:05:03 +0000 (14:05 +0000)
228 files changed:
Aster/editeur.ini
Aster/eficas_aster.py
Aster/prefs.py
Editeur/Interp.py [deleted file]
Editeur/Objecttreeitem.py
Editeur/Patrons/limaillage.comm
Editeur/TroisDPal.py [deleted file]
Editeur/__init__.py
Editeur/appli.py [deleted file]
Editeur/basestyle.py [deleted file]
Editeur/browser.py [deleted file]
Editeur/bureau.py [deleted file]
Editeur/catabrowser.py [deleted file]
Editeur/cataediteur.py [deleted file]
Editeur/centerwindow.py [deleted file]
Editeur/change_comm.py [deleted file]
Editeur/comploader.py
Editeur/compobase.py [deleted file]
Editeur/compobloc.py [deleted file]
Editeur/compocomm.py [deleted file]
Editeur/compocommandecomm.py [deleted file]
Editeur/compoerror.py [deleted file]
Editeur/compofact.py [deleted file]
Editeur/compoformule.py [deleted file]
Editeur/compojdc.py [deleted file]
Editeur/compomacro.py [deleted file]
Editeur/compomclist.py [deleted file]
Editeur/componiveau.py [deleted file]
Editeur/componuplet.py [deleted file]
Editeur/compooper.py [deleted file]
Editeur/compoparam.py [deleted file]
Editeur/compoparameval.py [deleted file]
Editeur/compoproc.py [deleted file]
Editeur/composimp.py [deleted file]
Editeur/configuration.py
Editeur/definition_cata.py [deleted file]
Editeur/eficas.py [deleted file]
Editeur/eficas_go.py [deleted file]
Editeur/eficas_test.py [deleted file]
Editeur/faq.py [deleted file]
Editeur/faqs.txt [deleted file]
Editeur/fenetre_mc_inconnus.py [deleted file]
Editeur/fonctionpanel.py [deleted file]
Editeur/fontes.py [deleted file]
Editeur/icons/__init__.py [new file with mode: 0644]
Editeur/icons/empty.png [new file with mode: 0644]
Editeur/images.py [deleted file]
Editeur/import_code.py
Editeur/jdcdisplay.py [deleted file]
Editeur/listeFichiers.py [deleted file]
Editeur/listePatrons.py
Editeur/macrodisplay.py [deleted file]
Editeur/menubar.py [deleted file]
Editeur/newsimppanel.py [deleted file]
Editeur/options.py [deleted file]
Editeur/panels.py [deleted file]
Editeur/panelsSalome.py [deleted file]
Editeur/patches.py [deleted file]
Editeur/plusieursassdpanel.py [deleted file]
Editeur/plusieursbasepanel.py [deleted file]
Editeur/plusieursintopanel.py [deleted file]
Editeur/plusieurspanel.py [deleted file]
Editeur/readercata.py [deleted file]
Editeur/session.py
Editeur/shellpanel.py [deleted file]
Editeur/splash.py [deleted file]
Editeur/statusbar.py [deleted file]
Editeur/styles.py [deleted file]
Editeur/toolbar.py [deleted file]
Editeur/tooltip.py [deleted file]
Editeur/treeitemincanvas.py [deleted file]
Editeur/treewidget.py [deleted file]
Editeur/uniqueassdpanel.py [deleted file]
Editeur/uniquebasepanel.py [deleted file]
Editeur/uniquecomppanel.py [deleted file]
Editeur/uniqueintopanel.py [deleted file]
Editeur/uniquepanel.py [deleted file]
Editeur/uniquesdcopanel.py [deleted file]
Editeur/widgets.py [deleted file]
Extensions/etape_niveau.py
Ihm/I_FORM_ETAPE.py
InterfaceQT/__init__.py [new file with mode: 0644]
InterfaceQT/browser.py [new file with mode: 0644]
InterfaceQT/compobloc.py [new file with mode: 0644]
InterfaceQT/compocomm.py [new file with mode: 0644]
InterfaceQT/compofact.py [new file with mode: 0644]
InterfaceQT/compoformule.py [new file with mode: 0644]
InterfaceQT/compojdc.py [new file with mode: 0644]
InterfaceQT/compomacro.py [new file with mode: 0644]
InterfaceQT/compomclist.py [new file with mode: 0644]
InterfaceQT/componiveau.py [new file with mode: 0644]
InterfaceQT/componuplet.py [new file with mode: 0644]
InterfaceQT/compooper.py [new file with mode: 0644]
InterfaceQT/compoparam.py [new file with mode: 0644]
InterfaceQT/compoparameval.py [new file with mode: 0644]
InterfaceQT/compoproc.py [new file with mode: 0644]
InterfaceQT/composimp.py [new file with mode: 0644]
InterfaceQT/editor.py [new file with mode: 0644]
InterfaceQT/eficas.py [new file with mode: 0644]
InterfaceQT/monChoixCata.py [new file with mode: 0644]
InterfaceQT/monCommandePanel.py [new file with mode: 0644]
InterfaceQT/monCommentairePanel.py [new file with mode: 0644]
InterfaceQT/monFonctionPanel.py [new file with mode: 0644]
InterfaceQT/monFormulePanel.py [new file with mode: 0644]
InterfaceQT/monMCFactPanel.py [new file with mode: 0644]
InterfaceQT/monMCListAjoutPanel.py [new file with mode: 0644]
InterfaceQT/monMacroPanel.py [new file with mode: 0644]
InterfaceQT/monPlusieursASSDPanel.py [new file with mode: 0644]
InterfaceQT/monPlusieursBasePanel.py [new file with mode: 0644]
InterfaceQT/monPlusieursIntoPanel.py [new file with mode: 0644]
InterfaceQT/monRacinePanel.py [new file with mode: 0644]
InterfaceQT/monUniqueASSDPanel.py [new file with mode: 0644]
InterfaceQT/monUniqueBasePanel.py [new file with mode: 0644]
InterfaceQT/monUniqueCompPanel.py [new file with mode: 0644]
InterfaceQT/monUniqueIntoPanel.py [new file with mode: 0644]
InterfaceQT/myMain_ui.py [new file with mode: 0644]
InterfaceQT/panelsQT.py [new file with mode: 0644]
InterfaceQT/politiquesValidation.py [new file with mode: 0644]
InterfaceQT/prefsQT.py [new file with mode: 0644]
InterfaceQT/qtCommun.py [new file with mode: 0644]
InterfaceQT/qtEficas.py [new file with mode: 0644]
InterfaceQT/qtSaisie.py [new file with mode: 0644]
InterfaceQT/readercata.py [new file with mode: 0644]
InterfaceQT/typeNode.py [new file with mode: 0644]
InterfaceQT/utilIcons.py [new file with mode: 0644]
InterfaceQT/viewManager.py [new file with mode: 0644]
InterfaceQT/visualisation.py [new file with mode: 0644]
InterfaceTK/Interp.py [new file with mode: 0644]
InterfaceTK/Objecttreeitem.py [new file with mode: 0644]
InterfaceTK/TroisDPal.py [new file with mode: 0644]
InterfaceTK/__init__.py [new file with mode: 0644]
InterfaceTK/appli.py [new file with mode: 0644]
InterfaceTK/basestyle.py [new file with mode: 0644]
InterfaceTK/browser.py [new file with mode: 0644]
InterfaceTK/bureau.py [new file with mode: 0644]
InterfaceTK/catabrowser.py [new file with mode: 0644]
InterfaceTK/cataediteur.py [new file with mode: 0644]
InterfaceTK/centerwindow.py [new file with mode: 0644]
InterfaceTK/change_comm.py [new file with mode: 0755]
InterfaceTK/compobase.py [new file with mode: 0644]
InterfaceTK/compobloc.py [new file with mode: 0644]
InterfaceTK/compocomm.py [new file with mode: 0644]
InterfaceTK/compocommandecomm.py [new file with mode: 0644]
InterfaceTK/compoerror.py [new file with mode: 0644]
InterfaceTK/compofact.py [new file with mode: 0644]
InterfaceTK/compoformule.py [new file with mode: 0644]
InterfaceTK/compojdc.py [new file with mode: 0644]
InterfaceTK/compomacro.py [new file with mode: 0644]
InterfaceTK/compomclist.py [new file with mode: 0644]
InterfaceTK/componiveau.py [new file with mode: 0644]
InterfaceTK/componuplet.py [new file with mode: 0644]
InterfaceTK/compooper.py [new file with mode: 0644]
InterfaceTK/compoparam.py [new file with mode: 0644]
InterfaceTK/compoparameval.py [new file with mode: 0644]
InterfaceTK/compoproc.py [new file with mode: 0644]
InterfaceTK/composimp.py [new file with mode: 0644]
InterfaceTK/definition_cata.py [new file with mode: 0644]
InterfaceTK/eficas.py [new file with mode: 0644]
InterfaceTK/eficas_go.py [new file with mode: 0644]
InterfaceTK/eficas_test.py [new file with mode: 0644]
InterfaceTK/faq.py [new file with mode: 0644]
InterfaceTK/faqs.txt [new file with mode: 0755]
InterfaceTK/fenetre_mc_inconnus.py [new file with mode: 0644]
InterfaceTK/fonctionpanel.py [new file with mode: 0644]
InterfaceTK/fontes.py [new file with mode: 0644]
InterfaceTK/images.py [new file with mode: 0644]
InterfaceTK/jdcdisplay.py [new file with mode: 0644]
InterfaceTK/listeFichiers.py [new file with mode: 0644]
InterfaceTK/listePatronsTK.py [new file with mode: 0644]
InterfaceTK/macrodisplay.py [new file with mode: 0644]
InterfaceTK/menubar.py [new file with mode: 0644]
InterfaceTK/newsimppanel.py [new file with mode: 0644]
InterfaceTK/options.py [new file with mode: 0644]
InterfaceTK/panels.py [new file with mode: 0644]
InterfaceTK/panelsSalome.py [new file with mode: 0644]
InterfaceTK/patches.py [new file with mode: 0644]
InterfaceTK/plusieursassdpanel.py [new file with mode: 0644]
InterfaceTK/plusieursbasepanel.py [new file with mode: 0644]
InterfaceTK/plusieursintopanel.py [new file with mode: 0644]
InterfaceTK/plusieurspanel.py [new file with mode: 0644]
InterfaceTK/prefsTK.py [new file with mode: 0644]
InterfaceTK/readercata.py [new file with mode: 0644]
InterfaceTK/shellpanel.py [new file with mode: 0644]
InterfaceTK/splash.py [new file with mode: 0644]
InterfaceTK/statusbar.py [new file with mode: 0644]
InterfaceTK/styles.py [new file with mode: 0644]
InterfaceTK/toolbar.py [new file with mode: 0644]
InterfaceTK/tooltip.py [new file with mode: 0644]
InterfaceTK/treeitemincanvas.py [new file with mode: 0644]
InterfaceTK/treewidget.py [new file with mode: 0644]
InterfaceTK/uniqueassdpanel.py [new file with mode: 0644]
InterfaceTK/uniquebasepanel.py [new file with mode: 0644]
InterfaceTK/uniquecomppanel.py [new file with mode: 0644]
InterfaceTK/uniqueintopanel.py [new file with mode: 0644]
InterfaceTK/uniquepanel.py [new file with mode: 0644]
InterfaceTK/uniquesdcopanel.py [new file with mode: 0644]
InterfaceTK/widgets.py [new file with mode: 0644]
Ui/desChoixCata.py [new file with mode: 0644]
Ui/desChoixCata.ui [new file with mode: 0644]
Ui/desCommande.py [new file with mode: 0644]
Ui/desCommande.ui [new file with mode: 0644]
Ui/desCommentaire.py [new file with mode: 0644]
Ui/desCommentaire.ui [new file with mode: 0644]
Ui/desFormule.py [new file with mode: 0644]
Ui/desFormule.ui [new file with mode: 0644]
Ui/desInactif.py [new file with mode: 0644]
Ui/desInactif.ui [new file with mode: 0644]
Ui/desMCFact.py [new file with mode: 0644]
Ui/desMCFact.ui [new file with mode: 0644]
Ui/desMCListAjout.py [new file with mode: 0644]
Ui/desMCListAjout.ui [new file with mode: 0644]
Ui/desMacro.py [new file with mode: 0644]
Ui/desMacro.ui [new file with mode: 0644]
Ui/desPlusieursBase.py [new file with mode: 0644]
Ui/desPlusieursBase.ui [new file with mode: 0644]
Ui/desPlusieursInto.py [new file with mode: 0644]
Ui/desPlusieursInto.ui [new file with mode: 0644]
Ui/desRacine.py [new file with mode: 0644]
Ui/desRacine.ui [new file with mode: 0644]
Ui/desUniqueASSD.py [new file with mode: 0644]
Ui/desUniqueASSD.ui [new file with mode: 0644]
Ui/desUniqueBase.py [new file with mode: 0644]
Ui/desUniqueBase.ui [new file with mode: 0644]
Ui/desUniqueComp.py [new file with mode: 0644]
Ui/desUniqueComp.ui [new file with mode: 0644]
Ui/desUniqueInto.ui [new file with mode: 0644]
Ui/desUniqueIntoPanel.py [new file with mode: 0644]
Ui/myMain.ui [new file with mode: 0644]

index de8d11dd443a25695a29912942483d12eaa85402..77ef4249d8eaac970239360f5e813025d908c80f 100644 (file)
@@ -20,7 +20,7 @@
 
 import os
 
-import prefs
+from Aster import prefs
 
 rep_cata = os.path.join(prefs.REPINI,'Cata')
 rep_Pmw = os.path.join(prefs.REPINI,'../Pmw')
index 1d298b5810833ed94fccc64048802c3f9aff57ba..deaa5455a8fea74f6f19264a44bcf7ca0ee45c22 100755 (executable)
@@ -27,6 +27,6 @@
 
 # Modules Eficas
 import prefs
-from Editeur import eficas_go
+from InterfaceTK import eficas_go
 
 eficas_go.lance_eficas()
index 13b16d0d0904d72ab5b9a4de7c3ee6feeafb4d0b..bb3ff19495b7e5e65683d775907c39d52ff40218 100644 (file)
@@ -34,75 +34,33 @@ INSTALLDIR=os.path.join(REPINI,'..')
 # Par défaut on utilise les modules de INSTALLDIR
 # Peut valoir None (defaut)
 CODE_PATH = None
-#CODE_PATH = os.path.join(REPINI,'../../Superv')
 
 # la variable code donne le nom du code a selectionner
 code="ASTER" 
 
-# ICONDIR sert à localiser le répertoire contenant les icones
-# Par défaut on utilise le répertoire icons dans Editeur
-ICONDIR=os.path.join(INSTALLDIR,'Editeur','icons')
-
 # lang indique la langue utilisée pour les chaines d'aide : fr ou ang
 lang='fr'
 
 # Codage des strings qui accepte les accents (en remplacement de 'ascii')
 encoding='iso-8859-1'
 
-labels= ('Fichier','Edition','Jeu de commandes',
-                'Options',
-                'Aide',
-                 'Traduction',
-           )
 
-appli_composants=['readercata','bureau',
-#                  'browser',
-                   'options',
-           ]
+EditeurDir=INSTALLDIR+"/Editeur"
+sys.path[:0]=[EditeurDir]
+sys.path[:0]=[INSTALLDIR]
 
-menu_defs={ 'bureau': [
-              ('Fichier',[
-                           ('Nouveau','newJDC','<Control-n>','Ctrl+N'),
-                           ('Nouvel INCLUDE','newJDC_include'),
-                           ('Ouvrir','openJDC','<Control-o>','Ctrl+O'),
-                           ('Enregistrer','saveJDC','<Control-s>','Ctrl+S'),
-                           ('Enregistrer sous','saveasJDC','<Control-e>','Ctrl+E'),
-                           None,
-                           ('Fermer','closeJDC','<Control-w>','Ctrl+W'),
-                           ('Quitter','exitEFICAS','<Control-q>','Ctrl+Q'),
-                         ]
-              ),
-              ('Edition',[
-                           ('Copier','copy','<Control-c>','Ctrl+C'),
-                           ('Couper','cut','<Control-x>','Ctrl+X'),
-                           ('Coller','paste','<Control-v>','Ctrl+V'),
-                         ]
-              ),
-              ('Jeu de commandes',[
-               ('Rapport de validation','visuCRJDC','<Control-r>','Ctrl+R'),
-               ('Fichier source','visu_txt_brut_JDC','<Control-b>','Ctrl+B'),
-               #('Paramètres Eficas','affichage_fichier_ini'),
-                                  ]
-              ),
-              ('Traduction',[
-               ('Traduction v7 en v8','TraduitFichier','<Control-t>','Ctrl+T'),
-                            ]
-              ),
-              ('Aide',[
-                        ('Aide EFICAS','aideEFICAS','<Control-a>','Ctrl+A'),
-                      ]
-              ),
-             ]
-           }
+# Imports pour  l IHM TK
+from InterfaceTK import prefsTK
+ICONDIR=os.path.join(INSTALLDIR,'Editeur','icons')
 
+# Preference
 if os.name == 'nt':
    userprefs = os.sep.join( [ os.environ['HOMEDRIVE'], os.environ['HOMEPATH'], 'Eficas_install', 'prefs.py' ])
 else :
    userprefs=os.path.expanduser("~/Eficas_install/prefs.py")
+
 if os.path.isfile(userprefs):
    try:
       execfile(userprefs)
    except:
       pass
-
-sys.path[:0]=[INSTALLDIR]
diff --git a/Editeur/Interp.py b/Editeur/Interp.py
deleted file mode 100644 (file)
index 8fb9582..0000000
+++ /dev/null
@@ -1,153 +0,0 @@
-# -*- 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 Tkinter,ScrolledText
-import os, sys, string, traceback 
-import code
-
-sys.ps1 = ">>> "
-sys.ps2 = "... "
-
-class PythonInterpreter( code.InteractiveConsole):
-    def __init__( self, text, namespace = None):
-        code.InteractiveConsole.__init__( self, namespace)
-        self.text = text
-
-    def showtraceback( self):
-        start = self.text.pos + " - 1 lines"
-        code.InteractiveConsole.showtraceback( self)
-        end = self.text.pos
-        self.text.tag_add( "exception", start, end)
-
-class InterpWindow(Tkinter.Toplevel):
-    def __init__(self,namespace, parent=None):
-        Tkinter.Toplevel.__init__(self,parent)
-        self._initTkWidgets()
-        self.stdout = self.stderr = self
-        self.pos = '1.0'
-        self.history = [ '' ]
-        self.hpos = 0
-        self.tabCount = 0
-        self.shell = PythonInterpreter( self,namespace)
-        self.write("Python %s on %s\n%s\n(%s)\n" %
-                       (sys.version, sys.platform, sys.copyright,
-                        self.__class__.__name__))
-        self.write( sys.ps1)
-        self.text.focus_set()
-
-    def _initTkWidgets( self):
-        self.text = ScrolledText.ScrolledText( self, bg = "white",fg="black", wrap="word")
-        self.text.pack( fill='both', expand = 1)
-        self.text.bind( '<KeyPress>', self.clearMsg)
-        self.text.bind( '<Return>', self.inputhandler)
-        self.text.bind( '<KP_Enter>', self.inputhandler)
-        self.text.bind( '<Up>', self.uphistory)
-        self.text.bind( '<Down>', self.downhistory)
-        self.text.bind( '<Control-a>', self.goto_sol)
-        self.text.bind( '<Control-d>', self.sendeof)
-        self.text.tag_config("exception", foreground = "red")
-
-    def swapStdFiles(self):
-        sys.stdout,self.stdout = self.stdout,sys.stdout
-        sys.stderr,self.stderr = self.stderr,sys.stderr
-
-    def write(self, data):
-        self.text.insert("end", data)
-        self.pos = self.text.index("end - 1 char")
-        self.text.yview_pickplace("end")
-
-    def tag_add( self, tag, start, end):
-        self.text.tag_add( tag, start, end)
-
-    def inputhandler(self, *args):
-        # Remove any extraneous stuff
-        self.text.delete( self.pos + " lineend", "end")
-        # Now get the line
-        line = self.text.get(self.pos, "end - 1 char")
-        self.text.insert("end", "\n")
-        self.pos = self.text.index("end")
-        self.addHistory( line)
-        self.swapStdFiles()
-        if self.shell.push( line):
-            self.write(sys.ps2)
-        else:
-            self.write(sys.ps1)
-        self.swapStdFiles()
-        self.text.mark_set("insert", "end")
-        return "break"
-
-    def addHistory( self, line):
-        if line:
-            self.history.insert( len( self.history) - 1, line)
-            self.hpos = len( self.history) - 1
-
-    def sendeof(self, *args):
-        self.destroy()
-        return "break"
-
-    def uphistory(self, event=None):
-        if not self.history: return "break"
-
-        if self.hpos > 0:
-            self.hpos = self.hpos - 1
-
-        line = self.history[ self.hpos]
-        self.text.delete( self.pos, "end")
-        self.text.insert( self.pos, line)
-
-        return "break"
-
-    def downhistory( self, event=None):
-        if not self.history: return "break"
-
-        if self.hpos < (len( self.history) - 1):
-            self.hpos = self.hpos + 1
-
-        line = self.history[ self.hpos]
-        self.text.delete( self.pos, "end")
-        self.text.insert( self.pos, line)
-
-        return "break"
-
-    def goto_sol( self, event=None):
-        """
-        Met en mode edition la ligne courante
-        """
-        self.text.mark_set( 'insert', 'insert linestart + 4 chars')
-        return "break"
-        
-    def clearMsg( self, event=None):
-        index = self.text.index( "insert")
-        self.text.delete( "insert lineend", "end")
-        self.tabCount = 0
-
-if __name__ == "__main__":
-    app = Tkinter.Tk()
-    d={'a':1}
-
-    def go():
-      InterpWindow(d,parent=app)
-
-    Tkinter.Button(app,text="Interp",command=go).pack()
-    Tkinter.Button(app,text="Quit",command=app.destroy).pack()
-
-    app.mainloop()
-
index 21998b578ea53a6e5d76bbdc22def68cafbfb1f8..e8067302f68ff6b5a74b8996172c944395583901 100644 (file)
@@ -27,7 +27,7 @@ from copy import copy,deepcopy
 
 # import du chargeur de composants
 from comploader import make_objecttreeitem
-import treewidget
+from InterfaceTK import treewidget
 from Ihm import CONNECTOR
 
 myrepr = Repr()
index bb12c443261e4a80b705a3ad82ed1833eeed2055..c3817331f465de6157b417b8bcd313f7cfdcc25b 100644 (file)
@@ -1,11 +1,12 @@
 
-
 DEBUT(CODE=_F(NOM='VIDE',
               NIV_PUB_WEB='INTERNET',),);
-#
 
-MA=LIRE_MAILLAGE();
+#
 
+MA1=LIRE_MAILLAGE();
 
 FIN();
+
 #
+
diff --git a/Editeur/TroisDPal.py b/Editeur/TroisDPal.py
deleted file mode 100644 (file)
index c0cc0d0..0000000
+++ /dev/null
@@ -1,48 +0,0 @@
-# -*- 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 contient la classe 3Dpilote qui va creer les ordres 
-   de pilotage de l idl PAL pour un element de structure
-"""
-import generator
-
-class TroisDPilote:
-
-   def __init__(self,node,appli,parent):
-      self.node=node
-      self.appli=appli
-      self.parent=parent
-
-   def envoievisu(self):
-      """ 
-      """
-      format="vers3DSalome"
-      if generator.plugins.has_key(format):
-         # Le generateur existe on l'utilise
-         g=generator.plugins[format]()
-         g.init_jdc(self.node.get_jdc())
-         texte=g.gener(self.node)
-      else:
-         print "Le generateur n a pas ete trouvé"
-         print "Erreur ! Erreur!"
-         return ""
-      self.appli.envoievisu(texte)
-
index 28da2d3d83d4ea0f619f39c24654712a58dd8cd0..1260b69abfa7b3a3b2bfcf3eee7130684668bc3e 100644 (file)
@@ -18,3 +18,7 @@
 #
 #
 # ======================================================================
+"""
+    Ce package contient les fonctionnalités COMMUNES nécessaires
+    aux deux éditeurs graphiques QT et TK
+"""
diff --git a/Editeur/appli.py b/Editeur/appli.py
deleted file mode 100644 (file)
index 140d449..0000000
+++ /dev/null
@@ -1,447 +0,0 @@
-# -*- 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 contient la classe APPLI qui est la classe mère de
-    l'application EFICAS. Elle prend en charge l'organisation générale
-    des composants graphiques et l'initialisation Tk
-    L'aspect applicatif doit etre pris en charge par la classe dérivée
-"""
-# Modules Python
-import os
-import string
-import sys
-import types
-import Pmw
-import Tkinter
-from widgets import showerror
-
-# Modules Eficas
-import splash
-import prefs
-import styles
-from styles import style
-import fontes
-import tooltip
-import properties
-import convert,generator
-import comploader
-from utils import extension_fichier,stripPath
-
-from widgets import Fenetre
-from Misc import MakeNomComplet
-import session
-import listeFichiers
-import listePatrons
-
-VERSION="EFICAS v1.12"
-
-class APPLI: 
-  def __init__ (self,master,code=prefs.code,fichier=None,test=0) :
-      self.code=code
-      self.top=master
-      self.top.protocol("WM_DELETE_WINDOW",self.exitEFICAS)
-
-      #dimensionnement de la fenetre principale
-      #aspect ratio de l'ecran
-      aspect=float(self.top.winfo_screenwidth())/float(self.top.winfo_screenheight())
-      #resolution (pixels par point). On utilise le fait qu'on a "normalement" 72 points par inch
-      resolution= self.top.winfo_screenwidth()/(self.top.winfo_screenmmwidth()/25.4*72)
-      DDY=max(20,resolution*(fontes.standard[1]+4)) #largeur d'un caractere fonte standard en pixel
-      x=int(45*DDY) #largeur d'ouverture de 45 caracteres de fonte standard 
-      y=int(25*DDY) #hauteur d'ouverture de 25 caracteres de fonte standard
-      minx=x*8/10 #largeur min (80 pour cent de largeur)
-      miny=y*8/10 #hauteur min (80 pour cent de hauteur)
-      self.top.minsize(minx,miny)
-      self.top.geometry('%dx%d' % (x,y))
-
-      self.top.title(VERSION + ' pour '+self.code)
-      self.titre=VERSION + ' pour '+self.code
-      self.top.withdraw()
-      self.initializeTk(master)
-      Pmw.initialise(master)
-
-      self.dict_reels={}
-      self.liste_simp_reel=[]
-      # L'attribut test permet d'activer les panneaux de splash et d'erreur (test=0)
-      # Si test est different de 0, les panneaux ne sont pas activés
-      self.test=test
-
-      # Lecture des parametres de configuration (fichier global editeur.ini 
-      # et utilisateur eficas.ini)
-      self.lecture_parametres()
-
-      self.format_fichier = Tkinter.StringVar()
-      self.message=''
-      # Avant la creation du bureau qui lit le catalogue
-      self.version_code=session.d_env.cata
-
-      # Creation de la menubar, toolbar, messagebar
-      self.cree_composants_graphiques()
-      # Creation des autres composants graphiques dont le bureau (parametrable par prefs.py)
-      self.load_appli_composants()                
-      self.listeFichiers=listeFichiers.listeFichiers(self)
-      self.listePatrons=listePatrons.listePatrons(self)
-      self.dir=None
-
-      # Fermer le splash et deiconifier la fenetre principale si on n'est pas en test
-      if (self.test == 0):
-           splash.fini_splash()
-           #self.affiche_FAQ()
-
-      # Ouverture des fichiers de commandes donnes sur la ligne de commande
-      cwd=os.getcwd()
-      self.dir=cwd
-      for study in session.d_env.studies:
-          os.chdir(cwd)
-          d=session.get_unit(study,self)
-          self.bureau.openJDC(file=study["comm"],units=d)
-
-
-  def send_message(self,message):
-      self.message=message
-
-  def exitEFICAS(self):
-      self.quit()
-
-  def quit(self):
-      self.top.quit()
-
-  def lecture_parametres(self):
-      """
-          Active la lecture des paramètres standards et utilisateur
-      """
-      if (self.test == 0):
-         splash._splash.configure(text = "Chargement des paramètres utilisateur")
-      import configuration
-      self.CONFIGURATION = configuration.make_config(self,prefs.REPINI)
-      self.CONFIGStyle = configuration.make_config_style(self,prefs.REPINI)
-
-  def cree_composants_graphiques(self):
-      """
-          Cree les constituants graphiques fixes de l'application :
-           - menubar
-           - toolbar
-           - statusbar
-      """
-      if (self.test == 0):
-         splash._splash.configure(text = "Chargement de l'IHM")
-         splash._splash.configure(text = "Chargement de la menubar")
-      import menubar
-      self.menubar=menubar.MENUBAR(self,self.top)
-      if (self.test == 0):
-         splash._splash.configure(text = "Chargement de la toolbar")
-      import toolbar
-      self.toolbar=toolbar.TOOLBAR(self,self.top)
-      if (self.test == 0):
-         splash._splash.configure(text = "Chargement de la statusbar")
-      import statusbar
-      self.statusbar=statusbar.STATUSBAR(self.top,styles.style.statusfont)
-
-  def load_appli_composants(self):
-      """
-          Cree les autres constituants graphiques de l'application :
-           - bureau 
-           - readercata
-           - ...
-          Cette creation est parametrable par fichier prefs.py
-      """
-      if (self.test == 0):
-         splash._splash.configure(text = "Chargement des appli_composants")
-      for mname in self.appli_composants:
-         self.load_appli_composant(mname)
-
-  def load_appli_composant(self,mname):
-      module=__import__(mname,globals(),locals())
-      factory=getattr(module,mname.upper())
-      appli_composant=factory(self,self.top)
-      setattr(self,mname,appli_composant)
-      self.fill_menus(appli_composant,appli_composant.menu_defs)
-      self.toolbar.creer_boutons_appli_composant(appli_composant.button_defs,appli_composant)
-
-  def affiche_FAQ(self):
-      import faq
-      faq.affiche(self.top)
-
-  def affiche_infos(self,message):
-      self.statusbar.affiche_infos(message)
-      return
-
-  def  initializeTk(self, root):
-        """
-        Initialize platform specific options
-        """
-        if sys.platform == 'mac':
-            self.initializeTk_mac(root)
-        elif sys.platform == 'win32':
-            self.initializeTk_win32(root)
-        else:
-            self.initializeTk_unix(root)
-
-  def initializeTk_win32(self, root):
-        root.option_add('*Font', fontes.standard)
-        root.option_add('*EntryField.Entry.Font', fontes.standard)
-        root.option_add('*Listbox*Font',fontes.standard)
-
-  def initializeTk_colors_common(self, root):
-        root.option_add('*background', style.background)
-        root.option_add('*foreground', style.foreground)
-        root.option_add('*EntryField.Entry.background', style.entry_background)
-        root.option_add('*Entry*background', style.entry_background)
-        root.option_add('*Listbox*background', style.list_background)
-        root.option_add('*Listbox*selectBackground', style.list_select_background)
-        root.option_add('*Listbox*selectForeground', style.list_select_foreground)
-
-  def initializeTk_mac(self, root):
-        self.initializeTk_colors_common(root)
-
-  def initializeTk_unix(self, root):
-      root.option_add('*Font', fontes.standard)
-      root.option_add('*EntryField.Entry.Font',fontes.standard )
-      root.option_add('*Listbox*Font', fontes.standard)
-      self.initializeTk_colors_common(root)
-
-  def get_texte_infos(self):
-      """
-          Retourne un texte d'informations sur la session courante d'EFICAS
-      """
-      texte = VERSION + '\n\n'
-      texte = texte + 'EFICAS est un produit développé par \nEDF-R&D\n'
-      texte = texte + 'Equipe : SINETICS\n\n'
-      texte = texte + 'Code utilisé : %s version %s\n' % (self.code,properties.version)
-      return texte
-
-  def efface_aide(self,event):
-      """
-          Efface la bulle d'aide d'un panneau
-      """
-      try:
-          self.aide.destroy()
-      except:
-          pass
-      return
-
-  def affiche_aide(self,event,aide):
-      """
-          Affiche l'aide concernant un panneau
-      """
-      x=event.x
-      y=event.y
-      widget=event.widget
-      self.aide=tooltip.TOOLTIP(widget)
-      self.aide.xoffset = 10
-      self.aide.yoffset = - widget.winfo_height()/2
-      self.aide.setText(aide)
-      self.aide._showTip()
-      return 
-
-  def cree_menu(self,menu,itemlist,appli_composant):
-      """
-          Ajoute les items du tuple itemlist
-          dans le menu menu
-      """
-      number_item=0
-      radio=None
-      for item in itemlist:
-         number_item=number_item + 1
-         raccourci_label=""
-         if not item :
-            #menu.add_separator()
-            pass
-         else:
-            if len(item)==3:
-               raccourci=item[2]
-               raccourci_label="   "+raccourci
-               newitem=(item[0],item[1])
-            else :
-               if len(item)==4:
-                  raccourci=item[2]
-                  raccourci_label="   "+item[3]
-                  newitem=(item[0],item[1])
-               else :
-                  raccourci=""
-                  newitem=item
-            item=newitem
-            label,method=item
-            if type(method) == types.TupleType:
-               # On a un tuple => on cree une cascade
-               menu_cascade=Tkinter.Menu(menu)
-               menu.add_cascade(label=label,menu=menu_cascade)
-               self.cree_menu(menu_cascade,method,appli_composant)
-            elif method[0] == '&':
-               # On a une chaine avec & en tete => on cree un radiobouton
-               command=getattr(appli_composant,method[1:])
-               menu.add_radiobutton(label=label,command=command)
-               if radio == None:radio=number_item
-            else:
-               command=getattr(appli_composant,method)
-               menu.add_command(label=label,accelerator=raccourci_label,command=command)
-               if raccourci != "" :
-                  self.top.bind(raccourci,command)
-      # Si au moins un radiobouton existe on invoke le premier
-      if radio:menu.invoke(radio)
-
-  def fill_menus(self,appli_composant,defs):
-      menudict=self.menubar.menudict
-      for mname,itemlist in defs:
-          menu=menudict.get(mname)
-          if not menu:continue
-          self.cree_menu(menu,itemlist,appli_composant)
-
-  def update_jdc_courant(self):
-      self.bureau.update_jdc_courant()
-
-  def affiche_alerte(self,titre,message):
-      f=Fenetre(self, titre="Compte-rendu d'erreur", texte = titre + "\n\n" + message)
-      f.wait()
-
-
-class valeur:
-   def __init__(self,v=None):
-      self.v=v
-   def set(self,v):
-      self.v=v
-   def get(self):
-      return self.v
-
-class STANDALONE(APPLI):
-   def __init__ (self,code=prefs.code,fichier=None,version='v8.2') :
-      self.code=code
-      self.top=None
-      self.format_fichier=valeur()
-
-      self.dict_reels={}
-      self.liste_simp_reel=[]
-      # L'attribut test doit valoir 1 si on ne veut pas creer les fenetres
-      self.test=1
-      self.titre="STANDALONE POUR TEST"
-
-      # Lecture des parametres de configuration (fichier global editeur.ini
-      # et utilisateur eficas.ini)
-      self.lecture_parametres()
-
-      self.message=''
-      # Avant la creation du bureau qui lit le catalogue
-      self.version_code=version
-      import readercata
-      self.readercata=readercata.READERCATA(self,None)
-
-      self.dir=None
-
-   def affiche_infos(self,message):
-      return
-
-   def get_text_JDC(self,JDC,format):
-      if generator.plugins.has_key(format):
-         # Le generateur existe on l'utilise
-         g=generator.plugins[format]()
-         jdc_formate=g.gener(JDC,format='beautifie')
-         return jdc_formate
-      else:
-         # Il n'existe pas c'est une erreur
-         return
-
-   def newJDC(self):
-      CONTEXT.unset_current_step()
-      J=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,
-                                   )
-      J.analyse()
-      return J
-
-   def openJDC(self,file):
-      self.fileName = file
-      e=extension_fichier(file)
-      self.JDCName=stripPath(file)
-      self.initialdir = os.path.dirname(os.path.abspath(file))
-      format=self.format_fichier.get()
-      # 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('exec',self)
-         if not p.cr.estvide():
-             raise ValueError(str(p.cr))
-
-      # On se met dans le repertoire ou se trouve le fichier de commandes
-      # pour trouver les eventuels fichiers include ou autres
-      # localises a cote du fichier de commandes
-      os.chdir(self.initialdir)
-      CONTEXT.unset_current_step()
-      J=self.readercata.cata[0].JdC(procedure=text,
-                                    appli=self,
-                                    cata=self.readercata.cata,
-                                    cata_ord_dico=self.readercata.cata_ordonne_dico,
-                                    nom=self.JDCName,
-                                    rep_mat=self.CONFIGURATION.rep_mat,
-                                   )
-      J.analyse()
-      txt= J.cr.get_mess_exception()
-      if txt:raise ValueError(txt)
-      return J
-
-   def openTXT(self,text):
-      self.JDCName="TEXT"
-      CONTEXT.unset_current_step()
-      J=self.readercata.cata[0].JdC(procedure=text,
-                                    appli=self,
-                                    cata=self.readercata.cata,
-                                    cata_ord_dico=self.readercata.cata_ordonne_dico,
-                                    nom=self.JDCName,
-                                    rep_mat=self.CONFIGURATION.rep_mat,
-                                   )
-      J.analyse()
-      txt= J.cr.get_mess_exception()
-      if txt:raise ValueError(txt)
-      return J
-
-   def create_item(self,obj):
-      return comploader.make_objecttreeitem(self,getattr(obj,"nom","item"),obj)
-
-   def get_file(self,unite=None,fic_origine = ''):
-      """
-          Retourne le nom du fichier correspondant a l unite logique unite (entier)
-          ou d'un fichier poursuite
-      """
-      f,ext=os.path.splitext(fic_origine)
-      if unite :
-          #include
-          finclude=f+".%d" % unite
-      else:
-          #poursuite
-          n=ext[-1]
-          if n == '0':
-             ext=".comm"
-          else: 
-             ext=".com%d" % (string.atoi(n)-1)
-             if ext == '.com0' and not os.path.isfile(f+".com0"):
-                ext=".comm"
-          finclude=f+ext
-      ff=open(finclude)
-      text=ff.read()
-      ff.close()
-      return finclude,text
-
-   def affiche_alerte(self,titre,message):
-      print titre+ "\n\n" + message
diff --git a/Editeur/basestyle.py b/Editeur/basestyle.py
deleted file mode 100644 (file)
index e4287b7..0000000
+++ /dev/null
@@ -1,27 +0,0 @@
-class STYLE:
-    background='gray90'
-    foreground='black'
-    entry_background='white'
-    list_background='white'
-    list_select_background='#00008b'
-    list_select_foreground='grey'
-    tooltip_background="yellow"
-
-    standard = ("Helvetica",12)
-    standard_italique = ("Helvetica",12,'italic')
-    standard_gras = ("Helvetica",12,'bold')
-    standard_gras_souligne = ("Helvetica",12,'bold','underline')
-
-    canvas = ('Helvetica',10)
-    canvas_italique = ('Helvetica',10,'italic')
-    canvas_gras = ("Helvetica",10,'bold')
-    canvas_gras_italique = ("Helvetica",12,'bold','italic')
-
-    standard12 = ("Helvetica",14)
-    standard12_gras = ("Helvetica",14,'bold')
-    standard12_gras_italique = ( "Helvetica",14,'bold','italic')
-
-    standardcourier10 = ("Courier",14)
-    statusfont = ("Helvetica",16)
-
-style=STYLE()
diff --git a/Editeur/browser.py b/Editeur/browser.py
deleted file mode 100644 (file)
index 51c4e3a..0000000
+++ /dev/null
@@ -1,65 +0,0 @@
-# -*- 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 os,string
-
-# Modules Eficas
-import Interp
-import catabrowser
-import cataediteur
-
-class BROWSER:
-
-   menu_defs=[
-              ('Browsers',[
-                           ('Browser catalogue','browser_catalogue'),
-                           ('Editeur catalogue','edite_catalogue'),
-                           ('Shell','shell'),
-                         ]
-              )
-             ]
-
-   button_defs=[]
-
-   def __init__(self,appli,parent):
-      self.appli=appli
-      self.parent=parent
-      self.cataitem = catabrowser.CATAItem(self,"Catalogue "+self.appli.readercata.code,
-                                           self.appli.readercata.cata,
-                                           objet_cata_ordonne = self.appli.readercata.cata_ordonne_dico)
-
-   def shell(self,event=None):
-      if not hasattr(self.appli.bureau.JDCDisplay_courant,'jdc'):return
-      d={'j':self.appli.bureau.JDCDisplay_courant.jdc}
-      Interp.InterpWindow(d,parent=self.parent)
-
-   def browser_catalogue(self,event=None):
-      catabrowser.CataBrowser(parent=self.parent,appli=self.appli,
-                                cata = self.appli.readercata.cata,
-                                item = self.cataitem)
-
-   def edite_catalogue(self,event=None):
-      cataediteur.CataEditeur(parent=self.parent,appli=self.appli,cata=self.appli.readercata.cata)
-
-
-
diff --git a/Editeur/bureau.py b/Editeur/bureau.py
deleted file mode 100644 (file)
index b1a408d..0000000
+++ /dev/null
@@ -1,768 +0,0 @@
-# -*- 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 contient la classe BUREAU qui gere les JDC ouverts
-"""
-# Modules Python
-import os,string,sys
-import traceback
-import Pmw
-from widgets import askopenfilename,asksaveasfilename
-from widgets import showinfo,askyesno,showerror
-
-# Modules Eficas
-import splash
-import prefs
-import convert
-import generator
-import AIDE
-import os
-from jdcdisplay import JDCDISPLAY
-from utils import extension_fichier,stripPath,save_in_file
-from widgets import Fenetre,Ask_Format_Fichier,FenetreSurLigneWarning
-from fenetre_mc_inconnus import fenetre_mc_inconnus
-from Ihm import CONNECTOR
-from Traducteur import traduitV7V8 
-
-import comploader
-
-class BUREAU:
-   menu_defs=[
-              ('Fichier',[
-                           ('Nouveau','newJDC','<Control-n>'),
-                           ('Ouvrir','openJDC','<Control-o>'),
-                           ('Enregistrer','saveJDC','<Control-e>'),
-                           ('Enregistrer sous','saveasJDC','<Control-s>'),
-                           None,
-                           ('Fermer','closeJDC','<Control-f>'),
-                           ('Quitter','exitEFICAS','<Control-q>'),
-                         ]
-              ),
-              ('Edition',[
-                           ('Copier','copy','<Control-c>'),
-                           ('Couper','cut','<Control-x>'),
-                           ('Coller','paste','<Control-v>'),
-                         ]
-              ),
-              ('Jeu de commandes',[
-                                   ('Rapport de validation','visuCRJDC','<Control-r>'),
-                                   ('Fichier à plat','visu_a_plat','<Control-p>'),
-                                   ('Fichier .py','visuJDC_py'),
-                                   ('Fichier source','visu_txt_brut_JDC','<Control-b>'),
-                                   ('Paramètres Eficas','affichage_fichier_ini'),
-                                   ('Mots-clés inconnus','mc_inconnus'),
-                                  ]
-              ),
-              ('Traduction',[
-                             ('Traduction v7 en v8','TraduitFichier','<Control-t>','Ctrl+T')
-                            ]
-              ),
-              ('Aide',[
-                        ('Aide EFICAS','aideEFICAS'),
-                      ]
-              ),
-             ]
-
-   button_defs  =      (('New24',"newJDC","Création d'un nouveau fichier",'always'),
-                        ('Open24',"openJDC","Ouverture d'un fichier existant",'always'),
-                        ('Save24',"saveJDC","Sauvegarde du fichier courant",'always'),
-                        ('Fermer24',"closeJDC","Fermeture du fichier courant",'always'),
-                        ('Zoom24',"visuJDC","Visualisation du fichier de commandes",'always'),
-                        None,
-                        ('Copy24',"copy","Copie l'objet courant",'jdc'),
-                        ('Cut24',"cut","Coupe l'objet courant",'jdc'),
-                        ('Paste24',"paste","Colle l'objet copié après l'objet courant",'jdc'),
-                        None,
-                        ('Delete24',"delete","Supprime l'objet courant",'jdc'),
-                        ('Help24',"view_doc","Documentation de l'objet courant",'jdc')
-                       )
-   try:
-      menu_defs=prefs.menu_defs['bureau']
-   except:
-      pass
-   try:
-      button_defs=prefs.button_defs['bureau']
-   except:
-      pass
-
-   def __init__(self,appli,parent):
-      self.parent=parent
-      self.appli=appli
-      if self.appli.test == 0 :
-         splash._splash.configure(text = "Création du bureau")
-      self.nb = Pmw.NoteBook(self.parent,raisecommand=self.selectJDC)
-      self.nb.pack(fill='both',expand=1)
-      self.JDCDisplay_courant=None
-      self.fileName=None
-      self.liste_JDCDisplay=[]
-      comploader.charger_composants()
-      self.cree_cataitem()
-      self.text_reel=""
-      self.initialdir = self.appli.CONFIGURATION.initialdir
-
-   def cree_cataitem(self):
-      """
-          On récupère dans l'appli_composant readercata les variables 
-          qui servent par la suite pour la création des JDC
-      """
-      self.cataitem=self.appli.readercata.cataitem
-      self.cata=self.appli.readercata.cata
-      self.cata_ordonne_dico=self.appli.readercata.cata_ordonne_dico
-      self.code=self.appli.readercata.code
-      self.version_code=self.appli.readercata.version_code
-      self.fic_cata=self.appli.readercata.fic_cata
-
-   def selectJDC(self,event=None):
-      """
-          Cette méthode est appelée chaque fois que l'on sélectionne 
-          l'onglet d'un JDC dans le NoteBook des JDC.
-          Elle permet de stocker dans les variable self.JDC et 
-          self.JDCDisplay_courant les valeurs concernant le JDC courant
-      """
-      if len(self.liste_JDCDisplay) == 0 : return
-      #if self.JDCDisplay_courant : self.JDCDisplay_courant.jdc.unset_context()
-      numero_jdc = self.nb.index(self.nb.getcurselection())
-      self.JDCDisplay_courant.unselect()
-      self.JDCDisplay_courant = self.liste_JDCDisplay[numero_jdc]
-      self.JDC = self.JDCDisplay_courant.jdc
-      self.JDCName = self.JDC.nom
-      self.JDCDisplay_courant.select()
-      #print "selectJDC",numero_jdc,self.JDCDisplay_courant,self.JDCName
-
-
-   def newJDC_include(self,event=None):
-      """
-          Initialise un nouveau JDC include vierge
-      """
-      import Extensions.jdc_include
-      JdC_aux=Extensions.jdc_include.JdC_include
-
-      self.appli.statusbar.reset_affichage_infos()
-
-      CONTEXT.unset_current_step()
-      jaux=self.cata[0].JdC(procedure="",appli=self.appli,
-                         cata=self.cata,cata_ord_dico=self.cata_ordonne_dico,
-                         rep_mat=self.appli.CONFIGURATION.rep_mat,
-                         )
-      jaux.analyse()
-
-      J=JdC_aux(procedure="",appli=self.appli,
-                         cata=self.cata,cata_ord_dico=self.cata_ordonne_dico,
-                         jdc_pere=jaux,
-                         rep_mat=self.appli.CONFIGURATION.rep_mat,
-                         )
-      J.analyse()
-      self.JDCName=J.nom
-      self.fileName=None
-      self.ShowJDC(J,self.JDCName)
-      self.appli.toolbar.active_boutons()
-      return J
-
-   def newJDC(self,event=None):
-      """
-          Initialise un nouveau JDC vierge
-      """
-      self.appli.statusbar.reset_affichage_infos()
-
-      CONTEXT.unset_current_step()
-      J=self.cata[0].JdC(procedure="",appli=self.appli,
-                         cata=self.cata,cata_ord_dico=self.cata_ordonne_dico,
-                         rep_mat=self.appli.CONFIGURATION.rep_mat,
-                         )
-      J.analyse()
-      self.JDCName=J.nom
-      self.fileName=None
-      self.ShowJDC(J,self.JDCName)
-      self.appli.toolbar.active_boutons()
-      return J
-
-   def ShowJDC(self,JDC,nom,label_onglet=None,JDCDISPLAY=JDCDISPLAY,enregistre="non"):
-      """
-          Lance l'affichage du JDC cad création du JDCDisplay
-          Rajoute le JDCDisplay à la liste des JDCDisplay si label_onglet == None cad si on crée
-          bien un nouveau JDCDisplay et non si on remplace (renommage de l'onglet)
-      """
-      self.JDC=JDC
-      self.JDCName = self.JDC.nom = nom
-      if label_onglet == None :
-          # On veut un nouvel onglet
-          label_onglet = self.GetLabelJDC()
-          self.nb.add(label_onglet,tab_text = nom,tab_width=20)
-          new = 'oui'
-      else :
-          new = 'non'
-      self.JDCDisplay_courant=JDCDISPLAY(self.JDC,nom,appli=self.appli,parent=self.nb.page(label_onglet))
-      if new == 'oui':
-          self.liste_JDCDisplay.append(self.JDCDisplay_courant)
-      self.JDCDisplay_courant.modified='n'
-      if enregistre != "non" :
-         self.JDCDisplay_courant.fichier=self.fileName
-      else :
-         self.initialdir = self.appli.CONFIGURATION.rep_user
-      self.nb.selectpage(label_onglet)
-      self.nb.setnaturalsize()
-      self.nb.bind_all("<Key-Next>",lambda e,s=self:s.selectArbreDown())
-      self.nb.bind_all("<Key-Prior>",lambda e,s=self:s.selectArbreUp())
-      self.nb.bind_all("<Insert>",lambda e,s=self:s.deplieReplieNode())
-      texte = "Jeu de commandes :" + self.JDCName+" ouvert"
-      CONNECTOR.Connect(JDC,"close",self.onClose,(self.JDCDisplay_courant,))
-      self.appli.affiche_infos(texte)
-
-   def onClose(self,jdcdisplay):
-      #print "onClose",jdcdisplay
-      self.closeJDCDISPLAY(jdcdisplay)
-
-   def closeJDCDISPLAY(self,jdc):
-      """
-        Ferme le jdcdisplay spécifié par l'argument jdc
-      """
-      if jdc is self.JDCDisplay_courant:
-         # on ferme le jdcdisplay courant
-         self.closeSelectedJDC()
-      else:
-         # on ferme un autre jdcdisplay que le courant
-         old_JDCDisplay=self.JDCDisplay_courant
-         old_page=self.nb.getcurselection()
-
-         self.JDCDisplay_courant=jdc
-         self.JDC=jdc.jdc
-         numero_jdc=self.liste_JDCDisplay.index(jdc)
-         self.nb.selectpage(numero_jdc)
-         #print numero_jdc
-      
-         self.closeSelectedJDC()
-         self.JDCDisplay_courant=old_JDCDisplay
-         self.JDC=old_JDCDisplay.jdc
-         self.nb.selectpage(old_page)
-
-   def closeJDC (self,event=None) :
-      """
-          Ferme le JDC associé au JDCDISPLAY selectionné
-      """
-      if self.JDCDisplay_courant :
-         self.JDCDisplay_courant.jdc.close()
-
-   def closeSelectedJDC (self) :
-      """
-      Ferme le JDC courant et détruit l'onglet associé dans le notebook self.nb
-      """
-      if self.JDCDisplay_courant.modified == 'o' :
-          message = "Voulez-vous sauvegarder le jeu de commandes "+self.JDC.nom+" courant ?"
-          reponse = askyesno(title="Sauvegarde du jdc courant",
-                             message=message)
-          if reponse :
-              test = self.saveJDC()
-              if test == 0 :
-                  self.appli.affiche_infos("Sauvegarde impossible")
-                  return
-
-      CONNECTOR.Disconnect(self.JDCDisplay_courant.jdc,"close",self.onClose,(self.JDCDisplay_courant,))
-      self.JDCDisplay_courant.supprime()
-      self.JDCDisplay_courant.jdc.supprime()
-      self.liste_JDCDisplay.remove(self.JDCDisplay_courant)
-      # Active le mecanisme de selection du notebook (selectJDC)
-      self.nb.delete(self.nb.getcurselection())
-
-      try:
-          index = self.nb.index(self.nb.getcurselection())
-          self.JDCDisplay_courant = self.liste_JDCDisplay[index]
-          self.JDC = self.JDCDisplay_courant.jdc
-      except:
-          self.JDC = None
-          self.JDCDisplay_courant = None
-          self.appli.toolbar.inactive_boutons()
-
-   def visuCRJDC(self,event=None):
-      return self.visuCR(mode='JDC')
-
-   def visuCR(self,mode):
-      """
-      Méthode permettant l'affichage du rapport de validation
-      """
-      if mode == 'JDC':
-          if not hasattr(self,'JDC') : return
-          if self.JDC == None : return
-          titre="rapport de validation du jeu de commandes courant"
-          cr = self.JDC.report()
-          #self.update_jdc_courant()
-      elif mode == 'CATA':
-          from Noyau.N_CR import CR
-          cr = CR()
-          cr.debut = "Début rapport de validation du catalogue"
-          cr.fin = "Fin rapport de validation du catalogue"
-          titre="rapport de validation du catalogue"
-          if hasattr(self,'cata_ordonne_cr') :
-              cr.add(self.cata_ordonne_cr)
-          if hasattr(self,'cata_dev_ordonne_cr') :
-              cr.add(self.cata_dev_ordonne_cr)
-          for cata in self.cata:
-              if hasattr(cata,'JdC'):
-                  cr.add(cata.JdC.report())
-      texte_cr = str(cr)
-      self.visu_texte_cr = Fenetre(self.appli,titre=titre,texte=texte_cr)
-
-   def openJDC(self,event=None,file=None,units=None,enregistre="oui"):
-      """
-          Demande à l'utilisateur quel JDC existant il veut ouvrir
-      """
-      if self.code == 'ASTER':
-          filetypes = ( ("format "+self.appli.format_fichier.get(), ".com*"),("Tous",'*'))
-      elif self.code == 'HOMARD' :
-          filetypes = ( ("format "+self.appli.format_fichier.get(), ".py"),("Tous",'*'))
-      else:
-          filetypes = ( ("format "+self.appli.format_fichier.get(), ".py"),)
-      if not hasattr(self,'initialdir'):
-         self.initialdir = self.appli.CONFIGURATION.initialdir
-
-      if not file :
-          file = askopenfilename(title="Ouverture d'un fichier de commandes Aster",
-                                 defaultextension=".comm",
-                                 filetypes = filetypes,
-                                 initialdir = self.initialdir)
-      if file :
-          self.fileName = file
-          e=extension_fichier(file)
-          self.JDCName=stripPath(file)
-          self.initialdir = os.path.dirname(os.path.abspath(file))
-      else :
-          return
-
-      format=self.appli.format_fichier.get()
-      # 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('exec',self.appli)
-         if not p.cr.estvide(): 
-            self.appli.affiche_infos("Erreur à la conversion")
-            Fenetre(self.appli,
-                    titre="compte-rendu d'erreurs, EFICAS ne sait pas convertir ce fichier",
-                    texte = str(p.cr)).wait()
-            return
-         if enregistre == "oui" :
-            self.appli.listeFichiers.aOuvert(file)
-      else:
-         # Il n'existe pas c'est une erreur
-         self.appli.affiche_infos("Type de fichier non reconnu")
-         showerror("Type de fichier non reconnu","EFICAS ne sait pas ouvrir ce type de fichier")
-         return
-
-      # On se met dans le repertoire ou se trouve le fichier de commandes
-      # pour trouver les eventuels fichiers include ou autres
-      # localises a cote du fichier de commandes
-      os.chdir(self.initialdir)
-      CONTEXT.unset_current_step()
-      J=self.cata[0].JdC(procedure=text,appli=self.appli,
-                         cata=self.cata,cata_ord_dico=self.cata_ordonne_dico,
-                         nom = self.JDCName,
-                         rep_mat=self.appli.CONFIGURATION.rep_mat,
-                         )
-      if units is not None:
-         J.recorded_units=units
-         J.old_recorded_units=units
-
-      J.analyse()
-      txt_exception = J.cr.get_mess_exception()
-      if txt_exception :
-          # des exceptions ont été levées à la création du JDC 
-          # --> on affiche les erreurs mais pas le JDC
-          self.JDC=J
-          self.appli.affiche_infos("Erreur fatale au chargement de %s" %file)
-          if self.appli.test == 0 :
-             showerror("Erreur fatale au chargement d'un fichier",txt_exception)
-      else:
-          self.ShowJDC(J,self.JDCName,enregistre=enregistre)
-          self.appli.toolbar.active_boutons()
-          # si le JDC ne contient rien (vide), on retourne ici
-          if len(self.JDC.etapes) == 0 : return
-          # dans le cas où le JDC est invalide, on affiche son CR
-          if not self.JDC.isvalid():
-             self.appli.top.update()
-             self.visuCR(mode='JDC')
-      return J
-
-   def deplieReplieNode(self):
-       self.JDCDisplay_courant.tree.tree.deplieReplieNode()
-
-   def selectArbreDown(self):
-       self.JDCDisplay_courant.tree.tree.canvas.focus_set()
-       self.JDCDisplay_courant.tree.tree.mot_down_force()
-
-   def selectArbreUp(self):
-       self.JDCDisplay_courant.tree.tree.canvas.focus_set()
-       self.JDCDisplay_courant.tree.tree.mot_up_force()
-
-   def GetLabelJDC(self,nb_jdc = 'absent'):
-      """
-      Retourne le label de l'onglet du NoteBook associé au JDC à afficher
-      """
-      if nb_jdc == 'absent':
-          nb_jdc = len(self.nb.pagenames())
-      nb_jdc = nb_jdc+1
-      label_onglet = 'JDC'+`nb_jdc`
-      if label_onglet not in self.nb.pagenames() :
-          return label_onglet
-      else :
-          return self.GetLabelJDC(nb_jdc)
-
-   def saveasJDC(self,event=None):
-      """ 
-           Sauvegarde le JDC courant en demandant impérativement à l'utilisateur de
-           donner le nom du fichier de sauvegarde 
-      """
-      self.saveJDC(echo='oui')
-
-   def saveJDC(self,echo='non'):
-      """ 
-          Sauvegarde le JDC courant.
-          Retourne 1 si la sauvegarde s'est bien faite, 0 sinon.
-
-            - Si echo = 'oui' : interactif (l'utilisateur donne le nom sous lequel il 
-                            veut sauver le JDC
-            - Si echo = 'non' : muet (sauvegarde le JDC dans JDC.procedure)
-      """
-      ok = 0
-      if not hasattr(self,'JDC') : return 0
-      format=self.appli.format_fichier.get()
-      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 == 'homard':
-            self.jdc_homard=g.get_homard()
-         if not g.cr.estvide():
-            self.appli.affiche_infos("Erreur à la generation")
-            showerror("Erreur à la generation","EFICAS ne sait pas convertir ce JDC")
-            return
-      else:
-         # Il n'existe pas c'est une erreur
-         self.appli.affiche_infos("Format %s non reconnu" % format)
-         showerror("Format %s non reconnu" % format,"EFICAS ne sait pas convertir le JDC")
-         return
-      self.jdc_fini = string.replace(jdc_formate,'\r\n','\n')
-
-      if echo =='oui' or self.JDCDisplay_courant.fichier == None:
-         ok = self.asknomsauvegardeJDC()
-      elif self.JDCDisplay_courant.fichier != None :
-         # le JDC a déjà un nom : on sauvegarde directement sans demander
-         # un autre nom au développeur
-         if not save_in_file(self.JDCDisplay_courant.fichier,self.jdc_fini,self.appli.dir) :
-              showinfo("Erreur","Problème à la sauvegarde du fichier :" + `self.JDCDisplay_courant.fichier`)
-              #return 0
-              ok = 0
-         else :
-              if self.appli.format_fichier.get() == 'homard':
-                  self.save_homard(self.JDCDisplay_courant.fichier,self.jdc_homard)
-              self.JDCDisplay_courant.stop_modif()
-              self.appli.affiche_infos("sauvegarde de "+`self.JDCDisplay_courant.fichier`+" effectuée")
-              ok = 1
-
-      if ok and hasattr( self.appli, 'salome'):
-         # eficas a été lancé à partir deSalome
-         #1)ajout dans l'arbre d'étude du nom du jdc
-         ok, msg = self.appli.addJdcInSalome( self.JDCDisplay_courant.fichier )
-
-         #2)CS_pbruno ??
-         from panelsSalome import SALOME_UNIQUE_BASE_Panel
-         if len(SALOME_UNIQUE_BASE_Panel.dict_fichier_unite) > 0 :
-            print 'CS_pbruno if len(SALOMchier_unite) > 0 :???????'
-            self.appli.creeConfigTxt( self.appli.CONFIGURATION.initialdir, SALOME_UNIQUE_BASE_Panel.dict_fichier_unite )
-
-         #3)création/mise à jours d'un maillage dans Salome
-         self.appli.createOrUpdateMesh()
-      return ok
-
-   def asknomsauvegardeJDC(self):
-      """ Demande à l'utilsateur le nom sous lequel il veut sauvegarder le JDC courant """
-      titre = "Sauvegarde d'un fichier de commandes "+self.code
-      if self.code == 'ASTER':
-          defext = ".comm"
-          filtyp = ( ("ASTER", ".comm"),)
-      else :
-          defext = ".py"
-          filtyp = ( (self.code, ".py"),)
-      sauvegarde = asksaveasfilename(title=titre,
-                                     defaultextension=defext,
-                                     filetypes = filtyp,
-                                     initialdir = self.initialdir)
-                            #initialdir = self.appli.CONFIGURATION.initialdir)
-                            #initialdir = self.appli.CONFIGURATION.rep_user)
-      if sauvegarde :
-          if not save_in_file(sauvegarde,self.jdc_fini,None) :
-              showinfo("Erreur","Problème à la sauvegarde du fichier "+`sauvegarde`)
-              return 0
-          else :
-              if self.appli.format_fichier.get() == 'homard':
-                  self.save_homard(sauvegarde,self.jdc_homard)
-              self.JDCDisplay_courant.stop_modif()
-              self.appli.affiche_infos("Sauvegarde effectuée")
-              if sauvegarde != self.JDCDisplay_courant.fichier :
-                  # l'utilisateur a sauvegardé le JDC sous un autre nom
-                  self.JDCDisplay_courant.fichier = sauvegarde
-                  self.JDCName = self.JDC.nom = stripPath(sauvegarde)
-                  self.JDC.changefichier(sauvegarde)
-                  self.changeNomPage()
-              return 1
-      else :
-          return 0
-
-   def changeNomPage(self):
-      """ Change le nom de l'onglet contenant le JDC courant : en fait détruit l'actuel
-          et recrée un autre onglet à la même place avec le bon nom 
-      """
-      nom = self.JDCName
-      self.JDCDisplay_courant.jdc.nom = nom
-      nom_page = self.nb.getcurselection()
-      num_page = self.nb.index(nom_page)
-      tab = self.nb.tab(num_page)
-      tab.configure(text = nom)
-
-   def exitEFICAS(self,event=None):
-      """
-          Permet de sortir d'EFICAS en demandant à l'utilisateur
-          s'il veut sauvegarder les modifications en cours
-      """
-      liste = self.GetListeJDCaSauvegarder()
-      if liste != [] :
-          # Certains fichiers n'ont pas été sauvegardés ...
-          if askyesno("Enregistrer modifications","Enregistrer les modifications ?") :
-              test = self.saveall(liste)
-              if test != 1 :
-                  return
-      if askyesno ("Quitter","Voulez-vous vraiment quitter l'application ?") :
-          for JDCDisplay in self.liste_JDCDisplay:
-              JDCDisplay.jdc.supprime()
-          self.appli.quit()
-          return
-
-   def GetListeJDCaSauvegarder(self) :
-      """ Retourne parmi la liste de tous les JDC ouverts la liste de ceux qui ont été modifiés """
-      if not self.JDCDisplay_courant : return []
-      if len(self.liste_JDCDisplay) == 0 : return l
-      l = []
-      for JDCDisplay in self.liste_JDCDisplay:
-          if JDCDisplay.modified == 'o' :
-              l.append(JDCDisplay)
-      return l
-
-   def copy(self,event=None):
-      """
-          Lance la copie sur le JDC courant
-      """
-      if self.JDCDisplay_courant : self.JDCDisplay_courant.doCopy()
-
-   def paste(self,event=None):
-      """
-           Lance le collage sur le JDC courant
-      """
-      if self.JDCDisplay_courant : self.JDCDisplay_courant.doPaste()
-
-   def cut(self,event=None):
-      """
-         Lance le cut sur le JDC courant
-      """
-      if self.JDCDisplay_courant: self.JDCDisplay_courant.doCut()
-
-   def delete(self):
-      """
-          Lance la suppression du noeud courant
-      """
-      if not self.JDCDisplay_courant : return
-      self.JDCDisplay_courant.init_modif()
-      self.JDCDisplay_courant.node_selected.delete()
-
-   def visuJDC_py(self,event=None):
-      """ 
-          Méthode permettant d'afficher dans une fenêtre à part l'écho au 
-          format python du jdc courant 
-      """
-      if not hasattr(self,'JDC') : return
-      jdc_fini = self.get_text_JDC('python')
-      if jdc_fini == None : return
-      Fenetre(self.appli,
-              titre = 'fichier '+ self.JDCName + ' à la syntaxe Python',
-              texte = jdc_fini)
-
-   def visuJDC(self):
-      """ 
-          Méthode permettant d'afficher dans une fenêtre à part l'écho au 
-          format .comm ou .py du jdc courant 
-      """
-      if not hasattr(self,'JDC') : return
-      titre = 'fichier '+ self.JDCName + ' à la syntaxe '+ self.code
-      format=self.appli.format_fichier.get()
-      self.jdc_fini = self.get_text_JDC(format)
-      if self.jdc_fini == None : return
-      self.visu_fichier_cmd = Fenetre(self.appli,titre=titre,texte = self.jdc_fini)
-
-   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 not g.cr.estvide():
-            self.appli.affiche_infos("Erreur à la generation")
-            showerror("Erreur à la generation","EFICAS ne sait pas convertir ce JDC")
-            return
-         else:
-            return jdc_formate
-      else:
-         # Il n'existe pas c'est une erreur
-         self.appli.affiche_infos("Format %s non reconnu" % format)
-         showerror("Format %s non reconnu" % format,"EFICAS ne sait pas convertir le JDC en format %s "% format)
-         return
-
-   def view_doc(self):
-      """
-          Permet d'ouvrir le fichier doc U de la commande au format pdf avec Acrobat Reader
-          - Ne fonctionne pas sous UNIX (chemin d'accès Acrobat Reader)
-          - indication du chemin d'accès aux fichiers pdf à revoir : trop statique
-      """
-      if not self.JDCDisplay_courant : return
-      try:
-          cle_doc = self.JDCDisplay_courant.node_selected.item.get_docu()
-          if cle_doc == None : return
-          cle_doc = string.replace(cle_doc,'.','')
-          cle_doc = string.replace(cle_doc,'-','')
-          commande = self.appli.CONFIGURATION.exec_acrobat
-          nom_fichier = cle_doc+".pdf"
-          fichier = os.path.abspath(os.path.join(self.appli.CONFIGURATION.path_doc,nom_fichier))
-          if os.name == 'nt':
-              os.spawnv(os.P_NOWAIT,commande,(commande,fichier,))
-          elif os.name == 'posix':
-              script ="#!/usr/bin/sh \n%s %s&" %(commande,fichier)
-              pid = os.system(script)
-      except AttributeError:
-          traceback.print_exc()
-          pass
-
-   def visu_a_plat(self,event=None):
-      """ 
-          Méthode permettant d'afficher dans une fenêtre à part l'écho 'à plat' du jdc courant 
-      """
-      if not hasattr(self,'JDC') : return
-      titre = 'fichier '+ self.JDCName + ' à plat '
-      self.jdc_fini = self.get_text_JDC('aplat')
-      if self.jdc_fini == None : return
-      self.visu_fichier_cmd = Fenetre(self.appli,titre=titre,texte = self.jdc_fini)
-
-   def visu_txt_brut_JDC(self,event=None):
-      """
-           Méthode permettant d'afficher le jeu de commandes tel qu'il a été passé au JDC
-      """
-      if not hasattr(self,'JDC') : return
-      titre = "fichier de commandes utilisateur"
-      #texte = self.JDC.procedure
-      #if texte == None:
-      if self.JDCDisplay_courant.fichier == None:
-            self.appli.affiche_infos("Pas de fichier initial")
-            showerror("Impossible de visualiser le fichier initial",
-                      "EFICAS ne peut visualiser le fichier initial.\nIl s'agit d'un nouveau JDC")
-            return
-      os.chdir(self.appli.dir)
-      f=open(self.JDCDisplay_courant.fichier,'r')
-      texte=f.read()
-      f.close()
-      self.visu_texte_JDC = Fenetre(self.appli,titre=titre,texte=texte)
-
-   def affichage_fichier_ini(self):
-      """
-           Affichage des valeurs des paramètres relus par Eficas
-      """
-      self.appli.CONFIGURATION.affichage_fichier_ini()
-
-   def saveall(self,liste):
-      """ 
-           Sauvegarde tous les JDC contenus dans liste 
-      """
-      test = 1
-      for JDCDisplay in liste :
-          self.JDCDisplay_courant=JDCDisplay
-          self.JDC = JDCDisplay.jdc
-          test = test * self.saveJDC(echo = 'non')
-      return test
-
-   def save_homard(self,nom,texte):
-       file_homard=nom+'.conf_homard'
-       try:
-           f=open(file_homard,'w')
-           for ligne in texte:
-               f.write(ligne)
-               f.write('\n')
-           f.close()
-       except:
-           print "Pb a la sauvegarde sous le format homard"
-       if hasattr( self.appli, 'salome'):
-           import eficasEtude
-           self.appli.salome.rangeInStudy(file_homard,"_CONF")
-
-# ---------------------------------------------------------------------------
-#                             Méthodes liées aux mots-clés inconnus
-# ---------------------------------------------------------------------------
-
-   def mc_inconnus(self):
-      l_mc = self.JDCDisplay_courant.jdc.get_liste_mc_inconnus()
-      o = fenetre_mc_inconnus(l_mc)
-      l = o.wait_new_list()
-      #print "mc_inconnus_new_list: ",l
-      #CCAR: Il n' y a pas de retour vers le JDC
-
-   def aideEFICAS(self,event=None):
-      AIDE.go(master=self.parent)
-
-   def update_jdc_courant(self):
-      self.JDCDisplay_courant.update()
-
-   def TraduitFichier(self):
-      directory = self.appli.CONFIGURATION.rep_user
-      FichieraTraduire = askopenfilename(title="Nom du  Fichier à Traduire",
-                                 defaultextension=".comm",
-                                 initialdir = directory 
-                                 )
-      if (FichieraTraduire == "" or FichieraTraduire == () ) : return
-      i=FichieraTraduire.rfind(".")
-      Feuille=FichieraTraduire[0:i]
-      FichierTraduit=Feuille+"v8.comm"
-      log=self.initialdir+"/convert.log"
-      os.system("rm -rf "+log)
-      os.system("rm -rf "+FichierTraduit)
-      Pmw.showbusycursor()
-      traduitV7V8.traduc(FichieraTraduire,FichierTraduit,log)
-      Pmw.hidebusycursor()
-      Entete="Fichier Traduit : "+FichierTraduit +"\n\n"
-      titre = "conversion de "+ FichieraTraduire
-
-      if  os.stat(log)[6] != 0L :
-          f=open(log)
-          texte_cr= f.read()
-          f.close()
-      else :
-          texte_cr = Entete  
-          commande="diff "+FichieraTraduire+" "+FichierTraduit+" >/dev/null"
-          try :
-            if os.system(commande) == 0 :
-               texte_cr = texte_cr + "Pas de difference entre le fichier V7 et le fichier traduit"
-          except :
-               pass
-
-      cptrendu = FenetreSurLigneWarning(self.appli,titre=titre,texte=texte_cr)
-
diff --git a/Editeur/catabrowser.py b/Editeur/catabrowser.py
deleted file mode 100644 (file)
index e1ed7fc..0000000
+++ /dev/null
@@ -1,398 +0,0 @@
-# -*- 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 os
-import sys
-import types
-import string
-import Pmw
-from Tkinter import *
-
-# Modules Eficas
-import fontes
-from treewidget import Tree
-from Objecttreeitem import TreeItem
-from Accas import AsException
-from Noyau.N_CR import justify_text
-from Accas import OPER,PROC,MACRO,FORM
-from Accas import FACT,BLOC,SIMP
-
-#
-__version__="$Name:  $"
-__Id__="$Id: catabrowser.py,v 1.3 2002/09/10 15:59:37 eficas Exp $"
-#
-class Tableau:
-  incr = 10
-  def __init__(self,parent,colonnes):
-    self.parent = parent
-    self.colonnes = colonnes
-    self.init()
-
-  def init(self):
-    # recherche du nombre maxi de lignes et de colonnes....
-    for col in self.colonnes :
-      nb_l = 0
-      if len(col) > nb_l : nb_l = len(col)
-    self.nb_lignes = nb_l
-    self.nb_colonnes = len(self.colonnes)
-    # initialisation des coordonnées dans le canvas
-    self.x0 = self.incr
-    self.y0 = self.incr
-    self.x = self.x0 + self.incr
-    self.y = self.y0 + self.incr
-
-  def affiche(self):    
-    self.scrolledcanvas=Pmw.ScrolledCanvas(self.parent,
-                                           hull_width=1.,
-                                           hull_height=1.,
-                                           borderframe=1)
-    Pmw.Color.changecolor(self.scrolledcanvas.component('canvas'),background='gray95')
-    self.scrolledcanvas.pack(padx=10,pady=10,expand=1, fill="both")
-    self.canvas = self.scrolledcanvas.component('canvas')
-    self.affiche_colonnes()
-
-  def affiche_colonnes(self):
-    for i in range(self.nb_lignes):
-      self.affiche_ligne(i)
-    self.aligne_colonnes()
-    self.trace_traits()
-    self.scrolledcanvas.resizescrollregion()
-
-  def get_xy_max(self):
-    try:
-      x0,y0,xmax,ymax = self.canvas.bbox(ALL)
-      return xmax,ymax
-    except:
-      return None,None
-    
-  def trace_traits(self):
-    xmax,ymax = self.get_xy_max()
-    if not xmax : return
-    xmax = xmax+self.incr
-    ymax = ymax+self.incr
-    # trace les traits horizontaux
-    for i in range(self.nb_lignes):
-      tag_lig = 'ligne_'+`i`
-      l_id = self.canvas.find_withtag(tag_lig)
-      x0,y0,x1,y1 = self.bbox(l_id)
-      self.canvas.create_line(x0-self.incr,y0-self.incr,xmax,y0-self.incr)
-    self.canvas.create_line(self.x0,ymax,xmax,ymax)  
-    # trace les traits verticaux
-    for j in range(self.nb_colonnes):
-      tag_col = 'colonne_'+`j`
-      l_id = self.canvas.find_withtag(tag_col)
-      x0,y0,x1,y1 = self.bbox(l_id)
-      self.canvas.create_line(x0-self.incr,y0-self.incr,x0-self.incr,ymax)
-    self.canvas.create_line(xmax,self.y0,xmax,ymax)
-    
-  def bbox(self,l_id):
-    x0,y0,x1,y1 = self.canvas.bbox(l_id[0])
-    for id in l_id[1:]:
-      x2,y2,x3,y3 = self.canvas.bbox(id)
-      x0 = min(x2,x0)
-      y0 = min(y2,y0)
-      x1 = max(x3,x1)
-      y1 = max(y3,y1)
-    return x0,y0,x1,y1
-  
-  def affiche_ligne(self,num_lig):
-    tag_lig = 'ligne_'+`num_lig`
-    num_col = 0
-    for col in self.colonnes:
-      tag_col = 'colonne_'+`num_col`
-      x = 100*num_col+self.x
-      id = self.canvas.create_text(x,self.y,
-                                   text = justify_text(col[num_lig],cesure=60),
-                                   tag=(tag_lig,tag_col),
-                                   anchor='nw',
-                                   font = fontes.canvas)
-      x0,y0,x1,y1 = self.canvas.bbox(id)
-      num_col = num_col+1
-    l_id = self.canvas.find_withtag(tag_lig)
-    x0,y0,x1,y1 = self.bbox(l_id)
-    self.y = y1 + 2*self.incr
-
-  def aligne_colonnes(self):
-    num_col = 0
-    for col in self.colonnes:
-      tag_col = 'colonne_'+`num_col`
-      l_id = self.canvas.find_withtag(tag_col)
-      if not l_id : continue
-      x0,y0,x1,y1 = self.bbox(l_id)
-      self.move(x1+self.incr,self.colonnes[num_col+1:],num_col+1)
-      num_col = num_col+1
-
-  def move(self,x,colonnes,num):
-    num_col = num
-    for col in colonnes:
-      tag_col = 'colonne_'+`num_col`
-      l_id = self.canvas.find_withtag(tag_col)
-      if not l_id : continue
-      x0,y0,x1,y1 = self.canvas.bbox(l_id[0])
-      self.canvas.move(tag_col,x+self.incr-x0,0)
-      num_col = num_col+1
-    
-class CATAPanel(Frame) :
-  """ Classe servant à créer le panneau représentant l'objet sélectionné dans l'arbre"""
-  def __init__(self,parent,panneau,node) :
-    self.parent=parent
-    self.panneau = panneau
-    self.node=node
-    Frame.__init__(self,self.panneau)
-    self.place(x=0,y=0,relheight=1,relwidth=1)
-    self.init()
-
-  def init(self):
-    # création du label initial
-    label = Label(self,
-                  text = 'Attributs de '+self.node.item.labeltext,
-                  font = fontes.standard_gras_souligne)
-    label.pack(side='top',pady=10)
-    # création des listes correspondant aux colonnes du tableau à afficher
-    colonne1,colonne2 = self.get_listes()
-    # affichage du tableau
-    self.tableau = Tableau(self,(colonne1,colonne2))
-    self.tableau.affiche()
-
-  def get_listes(self):    
-    self.node.item.get_dico_attributs()
-    l_cles_attributs = self.node.item.d_attributs.keys()
-    l_cles_attributs.sort()
-    ind=0
-    liste1 = []
-    liste2=[]
-    for nom_attr in l_cles_attributs :
-      valeur = self.node.item.d_attributs[nom_attr]
-      if type(valeur) == types.TupleType:
-        texte =''
-        for elem in valeur:
-          if type(elem) == types.ClassType:
-            texte = texte + elem.__name__
-          else:
-            texte = texte + str(elem)
-      elif type(valeur) == types.ClassType :
-        texte = valeur.__name__
-      else:
-        texte = str(valeur)
-      liste1.append(nom_attr)
-      liste2.append(texte)
-    return liste1,liste2
-
-class CATAItem(TreeItem):
-  panel = CATAPanel
-  def __init__(self,appli,labeltext,object,setfunction=None,objet_cata_ordonne = None):
-    self.appli = appli
-    self.labeltext = labeltext
-    self.object=object
-    self.setfunction = setfunction
-    self.objet_cata_ordonne = objet_cata_ordonne
-
-  def get_dico_fils(self):
-    d_fils = {}
-    if type(self.object) != types.TupleType:
-      for e in dir(self.object):
-        cmd = getattr(self.object,e)
-        if isCMD(cmd) :
-          d_fils[string.strip(cmd.nom)] = cmd
-    else:
-      for obj in self.object :
-        for e in dir(obj):
-          cmd = getattr(obj,e)
-          if isCMD(cmd) :
-            d_fils[string.strip(cmd.nom)] = cmd
-    self.d_fils = d_fils
-
-  def get_dico_attributs(self):
-    d_attributs ={}
-    if type(self.object) == types.TupleType :
-      self.d_attributs = d_attributs
-      return
-    l_noms_attributs = ['nom','op','sd_prod','reentrant','repetable','fr','docu','into','valide_vide','actif',
-                        'regles','op_init','niveau','definition','code','niveaux','statut',
-                        'defaut','min','max','homo','position','val_min','val_max','condition']
-    for nom_attribut in l_noms_attributs :
-      if hasattr(self.object,nom_attribut):
-        attr = getattr(self.object,nom_attribut)
-        d_attributs[nom_attribut] = attr
-    self.d_attributs = d_attributs
-
-  def get_liste_mc_ordonnee(self):
-    """ Retourne la liste ordonnée (suivant le catalogue) brute des fils
-    de l'entite courante """
-    if hasattr(self.objet_cata_ordonne,'ordre_mc'):
-      return self.objet_cata_ordonne.ordre_mc
-    else :
-      l=self.objet_cata_ordonne.keys()
-      l.sort()
-      return l
-      
-  def GetLabelText(self):
-    return self.labeltext,None,None
-
-  def get_fr(self):
-    return ''
-  
-  def isMCList(self):
-    return 0
-  
-  def GetSubList(self):
-    sublist=[]
-    if not hasattr(self,'d_fils'):
-      self.get_dico_fils()
-    # on classe les fils dans l'odre du catalogue ...
-    l_cles_fils = self.get_liste_mc_ordonnee()
-    for k in l_cles_fils :
-      if type(self.objet_cata_ordonne) == types.InstanceType :
-        objet_cata = self.objet_cata_ordonne.entites[k]
-      else :
-        objet_cata = self.objet_cata_ordonne.get(k,None)
-      item = make_objecttreeitem(self.appli,k + " : ",self.d_fils[k],
-                                 objet_cata_ordonne = objet_cata)
-      sublist.append(item)
-    return sublist
-
-  def GetIconName(self):
-    return 'ast-green-square'
-
-  def isactif(self):
-    return 1
-  
-class CMDItem(CATAItem):
-
-  def get_dico_fils(self):
-    self.d_fils = self.object.entites
-
-class SIMPItem(CATAItem):
-  d_fils={}
-  d_attributs={}
-
-  def GetIconName(self):
-    return 'ast-green-ball'
-
-  def IsExpandable(self):
-    return 0
-  
-class FACTItem(CMDItem):
-  def GetIconName(self):
-    return 'ast-green-los'
-
-class BLOCItem(FACTItem): pass
-
-class ATTRIBUTItem(SIMPItem):
-  def get_dico_attributs(self):
-    self.d_attributs = {}
-
-  def GetSubList(self):
-    return []
-
-  def IsExpandable(self):
-    return 0
-
-  def GetText(self):
-    return self.object
-
-  def GetIconName(self):
-    return 'aucune'  
-
-class CataBrowser:
-  def __init__(self,parent,appli,cata,item = None):
-    self.parent = parent
-    self.cata = cata
-    self.appli = appli
-    self.item = item
-    self.init()
-
-  def close(self):
-    self.top.destroy()
-
-  def init(self):
-    self.nodes={}
-    self.top = Pmw.Dialog(self.parent,
-                          title = "Visualisation d'un catalogue",
-                          buttons=('OK',),
-                          command = self.quit)
-    self.pane = Pmw.PanedWidget(self.top.component('dialogchildsite'),
-                                hull_width = 800,
-                                hull_height = 500,
-                                orient = 'horizontal')
-    self.pane.add('canvas',min = 0.4, max = 0.6, size = 0.5)
-    self.pane.add('panel',min = 0.4, max = 0.6, size = 0.5)
-    self.pane.pack(expand =1, fill = 'both')
-    self.scrolledcanvas = Pmw.ScrolledCanvas(self.pane.pane('canvas'),
-                                             hull_width=1.,
-                                             hull_height=1.,
-                                             borderframe=1)
-    Pmw.Color.changecolor(self.scrolledcanvas.component('canvas'),background='gray95')
-    self.scrolledcanvas.pack(padx=10,pady=10,expand=1, fill="both")
-    if self.item == None :
-      self.item = CATAItem(self.appli,"Catalogue",self.cata)
-    self.tree = Tree(self.appli,self.item,self.scrolledcanvas,command = self.select_node)
-    self.tree.draw()
-    self.node = self.tree.node_selected
-
-  def select_node(self,node):
-    self.nodes[node]=self.create_panel(node)
-
-  def create_panel(self,node):
-    if hasattr(node.item,"panel"):
-      return getattr(node.item,"panel")(self,self.pane.pane('panel'),node)
-      
-  def quit(self,nom_bouton) :
-    self.top.destroy()
-    
-  def settitle(self):
-    self.top.wm_title("Browser de catalogue " )
-    self.top.wm_iconname("CataBrowser")
-
-dispatch = {
-    OPER  : CMDItem,
-    PROC  : CMDItem,
-    MACRO  : CMDItem,
-    SIMP : SIMPItem,
-    FACT : FACTItem,
-    BLOC : BLOCItem,
-}
-
-def TYPE(o):
-  if isinstance(o,OPER):return OPER
-  elif isinstance(o,PROC):return PROC
-  elif isinstance(o,MACRO):return MACRO
-  elif isinstance(o,FORM):return MACRO
-  elif isinstance(o,SIMP):return SIMP
-  elif isinstance(o,FACT):return FACT
-  elif isinstance(o,BLOC):return BLOC
-  else:return type(o)
-
-def make_objecttreeitem(appli,labeltext, object, setfunction=None,objet_cata_ordonne=None):
-    t = TYPE(object)
-    if dispatch.has_key(t):
-      c = dispatch[t]
-    else:
-      #print 'on a un objet de type :',t,'  ',object
-      c = ATTRIBUTItem
-    return c(appli,labeltext, object, setfunction = setfunction,objet_cata_ordonne=objet_cata_ordonne)
-
-def isCMD(cmd):
-   return isinstance(cmd,OPER) or isinstance(cmd,PROC) or isinstance(cmd,MACRO) or isinstance(cmd,FORM)
-
-
-
diff --git a/Editeur/cataediteur.py b/Editeur/cataediteur.py
deleted file mode 100644 (file)
index cac0254..0000000
+++ /dev/null
@@ -1,975 +0,0 @@
-# -*- 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 os
-import sys
-import types
-import string
-import Pmw
-from widgets import showinfo
-from Tkinter import *
-
-# Modules Eficas
-import fontes
-from widgets import *
-from treewidget import Tree
-from Objecttreeitem import TreeItem
-from Accas import AsException
-from Noyau.N_CR import justify_text
-
-from Accas import ASSD,GEOM
-import definition_cata
-
-#
-__version__="$Name:  $"
-__Id__="$Id: cataediteur.py,v 1.8 2005/11/29 11:14:14 eficas Exp $"
-#
-
-Fonte_Niveau = fontes.canvas_gras_italique
-
-class Panel(Frame) :
-  """ Classe servant de classe mère à toutes celles représentant les
-      panneaux à afficher en fonction de la nature de l'objet en cours
-      Elle est toujours dérivée."""
-  def __init__(self,parent,panneau,node) :
-      self.parent=parent
-      self.panneau = panneau
-      self.node=node
-      Frame.__init__(self,self.panneau)
-      self.place(x=0,y=0,relheight=1,relwidth=1)
-      #self.creer_boutons()
-      self.init()
-
-  def creer_boutons(self):
-      """ Méthode créant les boutons se trouvant dans la partie contextuelle d'EFICAS
-      (à droite sous les onglets ) """
-      self.fr_but = Frame(self,height=30)
-      self.fr_but.pack(side='bottom',fill='x')
-      self.bouton_com = Button(self.fr_but,
-                               text = 'Commentaire',
-                               command = self.ajout_commentaire,
-                               width=14)
-      self.bouton_sup = Button(self.fr_but,
-                               text = "Supprimer",
-                               command=self.supprimer,
-                               width=14)
-      self.bouton_doc = Button(self.fr_but,
-                               text="Documentation",
-                               command=self.visu_doc,
-                               width=14)
-      self.bouton_cata = Button(self.fr_but,
-                                text = "Catalogue",
-                                command = self.show_catalogue,
-                                width=14)
-      if self.parent.appli.CONFIGURATION.isdeveloppeur == 'OUI':
-          self.bouton_sup.place(relx=0.25,rely = 0.5,relheight = 0.8,anchor='w')
-          self.bouton_cata.place(relx=0.5,rely = 0.5,relheight = 0.8,anchor='w')
-          self.bouton_doc.place(relx=0.75,rely = 0.5,relheight = 0.8,anchor='w')
-      else:
-          self.bouton_sup.place(relx=0.3,rely = 0.5,relheight = 0.8,anchor='w')
-          self.bouton_doc.place(relx=0.7,rely = 0.5,relheight = 0.8,anchor='w')
-
-  def show_catalogue(self):
-      try:
-          genea = self.node.item.get_genealogie()
-          self.parent.appli.browser_catalogue_objet(genea)
-      except Exception,e:
-          traceback.print_exc()
-      
-  def efface(self):
-      self.node.efface()
-      
-  def ajout_commentaire(self,ind='after'):
-      """ Ajoute un commentaire à l'intérieur du JDC, par défaut après le noeud en cours"""
-      if self.parent.modified == 'n' : self.parent.init_modif()
-      return self.node.append_brother("COMMENTAIRE",ind)
-    
-  def ajout_commentaire_first(self):
-      """ Ajoute un commentaire en début de JDC"""
-      if self.parent.modified == 'n' : self.parent.init_modif()
-      return self.node.append_child("COMMENTAIRE",'first')
-        
-  def visu_doc(self):
-      """ Permet d'ouvrir le fichier doc U de la commande au format pdf avec Acrobat Reader
-        - Ne fonctionne pas sous UNIX (chemin d'accès Acrobat Reader)
-        - indication du chemin d'accès aux fichiers pdf à revoir : trop statique"""
-      cle_doc = self.parent.appli.get_docu(self.node)
-      if cle_doc == None : return
-      cle_doc = string.replace(cle_doc,'.','')
-      commande = self.parent.appli.CONFIGURATION.exec_acrobat
-      nom_fichier = cle_doc+".doc"
-      rep_fichier = cle_doc[0:2]
-      fichier = os.path.abspath(os.path.join(self.parent.appli.CONFIGURATION.path_doc,rep_fichier,nom_fichier))
-      print 'commande =',commande
-      print 'fichier =',fichier
-      print 'existe =',os.path.isfile(fichier)
-      if os.name == 'nt':
-          os.spawnv(os.P_NOWAIT,commande,(commande,fichier))
-      elif os.name == 'posix':
-          script ="#!/usr/bin/sh \n%s %s" %(commande,nom_fichier)
-          pid = os.system(script)
-      
-  def supprimer(self):
-      """ Suppression du noeud courant """
-      if self.parent.modified == 'n' : self.parent.init_modif()
-      pere = self.node.parent
-      self.node.delete()
-      pere.select()
-      
-  def affiche(self):
-      """ Force l'affichage des fenêtres en cours """
-      self.tkraise()
-
-  def selectMC(self,name):
-      """ On retrouve le mot-clé sous le curseur pour affichage du fr """
-      cmd=self.node.item.get_definition()
-      texte_infos = ''
-      for e in cmd.entites.keys() :
-          if e == name :
-              texte_infos=getattr(cmd.entites[e],'fr')
-              break
-      if texte_infos == '' : texte_infos="Pas d'infos disponibles"
-      self.parent.appli.affiche_infos(texte_infos)
-
-  def defMC(self,name):
-      """ On ajoute un mot-clé à la commande : subnode """
-      if name == SEPARATEUR:return
-      if self.parent.modified == 'n' : self.parent.init_modif()
-      if name != "COMMENTAIRE":
-          self.node.append_child(name)
-      else :
-          self.ajout_commentaire()    
-
-  def selectFilsCmd(self,name):
-      pass
-          
-  def defFilsCmd(self,name):
-      pass
-    
-  def defCmdFirst(self,name):
-      """ On ajoute une commande ou un commentaire au début du fichier de commandes """
-      if name == SEPARATEUR:return
-      if self.parent.modified == 'n' : self.parent.init_modif()
-      if name != "COMMENTAIRE":
-          new_node = self.node.append_child(name,'first')
-      else :
-          new_node = self.ajout_commentaire_first()
-
-  def add_commande_avant(self,event=None):
-    pass
-
-  def add_commande_apres(self,event=None):
-    pass          
-        
-class OngletPanel(Panel) :
-  """ Cette classe est virtuelle et doit être dérivée
-      Elle contient les principales méthodes d'affichage des différents onglets"""
-
-  def raisecmd(self,page):
-      self.nb.page(page).focus_set()
-      if page == 'Concept': self._any.focus()
-
-  def affiche(self):
-      page=self.nb.getcurselection()
-      self.nb.page(page).focus_set()
-      if page == 'Concept':self._any.component('entry').focus_set()
-      self.tkraise()
-
-  def makeConceptPage(self,page):
-      """ Crée la page de saisie du nom du concept """
-      self.label = Label(page,text='Nom du concept :')
-      self.label.place(relx=0.1,rely=0.4)
-      self._any = Entry(page,relief='sunken')
-      self._any.place(relx=0.35,rely=0.4,relwidth=0.5)
-      self._any.bind("<Return>",lambda e,s=self:s.execConcept())
-      self._any.bind("<KP_Enter>",lambda e,s=self:s.execConcept())
-      self._any.insert(0,self.node.item.GetText())
-      type_sd = self.node.item.object.get_type_sd_prod()
-      if type_sd :
-          txt = "L'opérateur courant retourne un objet de type %s" %type_sd
-          self.label = Label(page, text = txt)
-          self.label.place(relx=0.5,rely=0.55,anchor='n')
-      self._any.focus()
-          
-  def makeCommandePage(self,page):
-      """ Affiche la page d'ajout d'une commande relativement à l'objet commande sélectionné """
-      titre = "Où voulez-vous insérer une commande par rapport à %s" %self.node.item.object.nom
-      Label(page,text=titre).place(relx=0.5,rely=0.2,anchor='w')
-      b_avant = Button(page,text='AVANT',
-                       command = self.node.item.add_commande_avant)
-      b_apres = Button(page,text='APRES',
-                       command = self.node.item.add_commande_apres)
-      b_avant.place(relx=0.35,rely=0.5,anchor='w')
-      b_apres.place(relx=0.65,rely=0.5,anchor='w')
-
-  def deselectMC(self,name):
-      self.parent.appli.affiche_infos('')
-    
-  def get_liste_cmd(self):
-      listeCmd = self.node.item.object.niveau.definition.get_liste_cmd()
-      return listeCmd
-
-  def get_liste_fils_cmd(self):
-      return ['Mot-clé simple','Mot-clé facteur','Bloc']
-
-  def makeMoclesPage(self,page):
-      frame1 = Frame(page,height = 20)
-      frame1.pack(side='top',fill='x')
-      label = Label(frame1,text ="Le mot-clé choisi sera ajouté à la fin du catalogue")
-      label.pack(side='top')
-      frame2 = Frame(page)
-      frame2.pack(side='top',fill='both',expand=1)
-      liste_cmd = self.get_liste_fils_cmd()
-      liste_commandes = (("<Enter>",self.selectFilsCmd),
-                         ("<Leave>",self.deselectFilsCmd),
-                         ("<Double-Button-1>",self.defFilsCmd))
-      Liste = ListeChoix(self,frame2,liste_cmd,liste_commandes = liste_commandes,titre = "Mots-clés")
-      Liste.affiche_liste()
-
-  def deselectFilsCmd(self,name):
-      pass
-    
-  def makeJDCPage(self,page):
-      liste_cmd = self.get_liste_cmd()
-      liste_commandes = (("<Enter>",self.selectCmd),
-                         ("<Leave>",self.deselectCmd),
-                         ("<Double-Button-1>",self.defCmdFirst))
-      Liste = ListeChoix(self,page,liste_cmd,liste_commandes = liste_commandes,filtre='oui',titre = "Commandes")
-      Liste.affiche_liste()
-
-  def makeReglesPage(self,page) :
-    regles = []
-    regles = self.node.item.get_regles()
-    dictionnaire = self.node.item.get_mc_presents()
-    texte_regles = []
-    l_regles_en_defaut=[]
-    if len(regles) > 0:
-      i = 0
-      for regle in regles :
-        texte_regles.append(regle.gettext())
-        texte,test = regle.verif(dictionnaire)
-        if test == 0 : l_regles_en_defaut.append(i)
-        i = i+1
-    Liste = ListeChoix(self,page,texte_regles,liste_marques=l_regles_en_defaut,active='non',titre="Règles")
-    Liste.affiche_liste()
-    #self.afficheListe(page,texte_regles,self.selectRegle,self.execRegle)
-
-  def execConcept(self):
-      """ Nomme le concept SD retourné par l'étape """
-      if self.parent.modified == 'n' : self.parent.init_modif()
-      nom = self._any.get()
-      # Pourquoi node.etape ???
-      #test,mess = self.node.etape.item.nomme_sd(nom)
-      test,mess = self.node.item.nomme_sd(nom)
-      self.parent.appli.affiche_infos(mess)
-      self.node.racine.update()
-  
-  def changed(self):
-      pass
-
-  def makeAttributsPage(self,page):
-    l_attributs=self.node.item.object.attributs
-    d_defauts = self.node.item.object.attributs_defauts
-    for attribut in l_attributs :
-      attr = self.node.item.object.entites_attributs.get(attribut,None)
-      if attr.valeur is d_defauts[attribut] :
-        texte = attribut+' = '+repr(attr.valeur)+' (defaut)'
-      else:
-        texte = attribut+' = '+repr(attr.valeur)
-      Label(page,text=texte).pack(side='top')
-
-  def makeSimpPage(self,page):
-    texte = "Où voulez-vous ajouter un mot-clé simple ?"
-    Label(page,text=texte).place(relx=0.5,rely=0.3,anchor='center')
-    b1 = Button(page,text='AVANT '+self.node.item.object.nom,command=self.add_simp_avant)
-    b2 = Button(page,text='APRES '+self.node.item.object.nom,command=self.add_simp_apres)
-    b1.place(relx=0.5,rely=0.5,anchor='center')
-    b2.place(relx=0.5,rely=0.6,anchor='center')
-
-  def add_simp_avant(self,event=None):
-    """
-    Ajoute un mot-clé simple avant celui courant
-    """
-    self.node.append_brother('new_simp','before')
-    self.node.update()
-
-  def add_simp_apres(self,event=None):
-    """
-    Ajoute un mot-clé simple après celui courant
-    """
-    self.node.append_brother('new_simp','after')
-    self.node.update()    
-    
-class TYPEPanel(Frame):
-  def __init__(self,parent,panneau,node) :
-      self.parent=parent
-      self.panneau = panneau
-      self.node=node
-      Frame.__init__(self,self.panneau)
-      self.place(x=0,y=0,relheight=1,relwidth=1)
-      self.creer_texte()
-
-  def creer_texte(self):
-      texte = "Le noeud sélectionné correspond à un type\n"
-      self.label = Label(self,text=texte)
-      self.label.place(relx=0.5,rely=0.4,relwidth=0.8,anchor='center')
-
-class OPERPanel(OngletPanel):
-  def init(self):
-    nb = Pmw.NoteBook(self,raisecommand=self.raisecmd)
-    
-    nb.pack(fill = 'both', expand = 1)
-    self.nb=nb
-    nb.add('Mocles', tab_text='Ajouter mots-clés')
-    nb.add('Commandes',tab_text='Ajouter une commande')
-    self.makeMoclesPage(nb.page("Mocles"))
-    self.makeCommandePage(nb.page("Commandes"))
-    nb.tab('Mocles').focus_set()
-    nb.setnaturalsize()
-    self.affiche()
-
-class SIMPPanel(OngletPanel):
-  def init(self):
-    nb = Pmw.NoteBook(self,raisecommand=self.raisecmd)
-    nb.pack(fill = 'both', expand = 1)
-    self.nb=nb
-    nb.add('generaux', tab_text='Données générales')
-    nb.add('ihm',tab_text='Données IHM')
-    nb.add('mocle',tab_text='Ajouter un mot-cle simple')
-    self.makeAttributsGenerauxPage(nb.page("generaux"))
-    self.makeAttributsIHMPage(nb.page("ihm"))
-    self.makeSimpPage(nb.page('mocle'))
-    nb.tab('generaux').focus_set()
-    nb.setnaturalsize()
-    self.affiche()
-
-  def makeAttributsGenerauxPage(self,page):
-    fr1 = Frame(page,bd=1,relief='raised')
-    fr2 = Frame(page,bd=1,relief='raised')
-    fr3 = Frame(page,bd=1,relief='raised')
-    fr4 = Frame(page,bd=1,relief='raised')
-    fr5 = Frame(page,bd=1,relief='raised')
-    fr1.place(relheight=0.14,relwidth=1,rely=0)
-    fr2.place(relheight=0.14,relwidth=1,rely=0.14)
-    fr3.place(relheight=0.29,relwidth=1,rely=0.28)
-    fr4.place(relheight=0.14,relwidth=1,rely=0.57)
-    fr5.place(relheight=0.28,relwidth=1,rely=0.71)
-    # nom du mot-clé
-    Label(fr1,text = 'Nom :').place(relx=0.05,rely=0.3,anchor='w')
-    self.e_nom = Entry(fr1)
-    self.e_nom.place(relx=0.35,rely=0.3,relwidth=0.3,anchor='w')
-    self.e_nom.bind("<Return>",lambda e,s=self : s.set_valeur_attribut('nom',None))
-    self.e_nom.bind("<KP_Enter>",lambda e,s=self : s.set_valeur_attribut('nom',None))
-    self.e_nom.insert(0,self.get_valeur_attribut('nom'))
-    # Statut
-    Label(fr1,text='Statut : ').place(relx=0.05,rely=0.7,anchor='w')
-    self.statut=StringVar()
-    valeurs_statut=[('obligatoire','o'),
-                    ('facultatif','f'),
-                    ('caché','c')
-                    ]
-    self.statut.set(self.node.item.object.get_valeur_attribut('statut'))
-    i=0
-    for text,mode in valeurs_statut:
-      b=Radiobutton(fr1,text=text,variable=self.statut,value=mode,
-                    command = lambda s=self,m=mode : s.set_valeur_attribut('statut',m))
-      b.place(relx=0.25+i*0.25,rely=0.7,anchor='w')
-      i=i+1
-    # Type ...
-    Label(fr2,text='Type de la valeur : ').place(relx=0.05,rely=0.5,anchor='w')
-    self.e_type = Entry(fr2)
-    self.e_type.place(relx=0.35,rely=0.5,relwidth=0.5,anchor='w')
-    self.e_type.insert(0,self.node.item.object.get_valeur_attribut('type'))
-    # Domaine de validité
-    Label(fr3,text='Domaine de validité : ').place(relx=0.05,rely=0.2,anchor='w')
-    self.domaine = StringVar()
-    self.domaine.set(self.node.item.object.get_valeur_attribut('domaine_validité'))
-    b1=Radiobutton(fr3,text='continu',variable=self.domaine,value='continu',
-                   command=lambda s=self,f=fr3 :s.change_domaine(f))
-    b2=Radiobutton(fr3,text='discret',variable=self.domaine,value='discret',
-                   command=lambda s=self,f=fr3 :s.change_domaine(f))
-    b1.place(relx=0.35,rely=0.2,anchor='w')
-    b2.place(relx=0.65,rely=0.2,anchor='w')
-    self.change_domaine(fr3)
-    # Défaut ...
-    if self.domaine.get() == 'continu':
-      # le développeur peut donner la valeur qu'il souhaite, moyennant la vérification de type...
-      Label(fr4,text='Valeur par défaut : ').place(relx=0.05,rely=0.5,anchor='w')
-      self.e_defaut = Entry(fr4)
-      self.e_defaut.place(relx=0.35,rely=0.5,relwidth=0.5,anchor='w')
-      if self.node.item.object.get_valeur_attribut('defaut') :
-        self.e_defaut.insert(0,self.node.item.object.get_valeur_attribut('defaut'))
-      self.e_defaut.bind("<Return>",lambda e,s=self : s.set_valeur_attribut('defaut',None))
-      self.e_defaut.bind("<KP_Enter>",lambda e,s=self : s.set_valeur_attribut('defaut',None))
-    else :
-      # dans le cas discret, la valeur par défaut doit être dans l'ensemble des valeurs possibles (into)
-      liste = self.node.item.object.get_valeur_attribut('into')
-      if self.node.item.object.get_valeur_attribut('defaut') :
-        self.set_valeur_attribut('defaut',self.node.item.object.get_valeur_attribut('defaut'))
-      if liste == None : liste = []
-      self.e_defaut = Pmw.OptionMenu(fr4,labelpos='w',label_text = "Valeur par défaut : ",
-                                     items = self.node.item.object.get_valeur_attribut('into'),
-                                     menubutton_width=30)
-      self.e_defaut.configure(command = lambda e,s=self : s.set_valeur_attribut('defaut',None))
-      self.e_defaut.place(relx=0.05,rely=0.5,anchor='w')
-    # Liste de valeurs ?
-    Label(fr5,text='Liste de valeurs : ').place(relx=0.05,rely=0.2,anchor='w')
-    self.liste_valeurs = BooleanVar()
-    liste_valeurs = [('OUI',1),('NON',0)]
-    self.liste_valeurs.set(0)
-    i=0
-    for text,mode in liste_valeurs:
-      b=Radiobutton(fr5,text=text,variable=self.liste_valeurs,value=mode,
-                    command=lambda s=self,f=fr5 :s.change_liste_valeurs(f))
-      b.place(relx=0.35+i*0.2,rely=0.2,anchor='w')
-      i=i+1
-    self.change_liste_valeurs(fr5)
-
-  def makeAttributsIHMPage(self,page):
-    fr1 = Frame(page,height=100,bd=1,relief='raised')
-    fr2 = Frame(page,height=50,bd=1,relief='raised')
-    fr1.pack(side='top',fill='x')
-    fr2.pack(side='top',fill='x')
-    # Champ fr ...
-    Label(fr1,text='Champ fr : ').place(relx=0.05,rely=0.35,anchor='w')
-    self.e_fr = Entry(fr1)
-    self.e_fr.place(relx=0.35,rely=0.35,relwidth=0.6,anchor='w')
-    self.e_fr.insert(0,self.node.item.object.get_valeur_attribut('fr'))
-    # Champ ang ...
-    Label(fr1,text='Champ ang : ').place(relx=0.05,rely=0.70,anchor='w')
-    self.e_ang = Entry(fr1)
-    self.e_ang.place(relx=0.35,rely=0.70,relwidth=0.6,anchor='w')
-    self.e_ang.insert(0,self.node.item.object.get_valeur_attribut('ang'))
-    # Clé documentaire ...
-    Label(fr2,text='Clé documentaire : ').place(relx=0.05,rely=0.50,anchor='w')
-    self.e_docu = Entry(fr2)
-    self.e_docu.place(relx=0.35,rely=0.50,relwidth=0.6,anchor='w')
-    self.e_docu.insert(0,self.node.item.object.get_valeur_attribut('docu'))
-    
-  def detruit_widgets(self,l_widgets):
-    for nom_widg in l_widgets :
-      try:
-        widg = getattr(self,nom_widg)
-        widg.place_forget()
-        delattr(self,nom_widg)
-      except:
-        pass
-
-  def change_liste_valeurs(self,fr5):
-    valeur = self.liste_valeurs.get()
-    if valeur == 0 :
-      # pas de liste de valeurs
-      l_widgets=['l_homo','b1_homo','b2_homo','l_min','e_min','l_max','e_max']
-      self.detruit_widgets(l_widgets)
-    elif valeur == 1:
-      # pas de widgets à détruire ...
-      if hasattr(self,'l_homo') :
-        # on est déjà en mode 'liste' --> rien à faire
-        return 
-      # homo
-      self.l_homo = Label(fr5,text='Liste homogène : ')
-      self.l_homo.place(relx=0.05,rely=0.4,anchor='w')
-      self.homo = BooleanVar()
-      self.homo.set(self.node.item.object.get_valeur_attribut('homo'))
-      self.b1_homo=Radiobutton(fr5,text='OUI',variable=self.homo,value=1)
-      self.b2_homo=Radiobutton(fr5,text='NON',variable=self.homo,value=0)
-      self.b1_homo.place(relx=0.35,rely=0.4,anchor='w')
-      self.b2_homo.place(relx=0.65,rely=0.4,anchor='w')
-      # min ...
-      self.l_min = Label(fr5,text='Longueur minimale : ')
-      self.l_min.place(relx=0.05,rely=0.6,anchor='w')
-      self.e_min = Entry(fr5)
-      self.e_min.place(relx=0.4,rely=0.6,relwidth=0.3,anchor='w')
-      self.e_min.insert(0,self.node.item.object.get_valeur_attribut('min'))
-      # max ...
-      self.l_max = Label(fr5,text='Longueur maximale : ')
-      self.l_max.place(relx=0.05,rely=0.8,anchor='w')
-      self.e_max = Entry(fr5)
-      self.e_max.place(relx=0.4,rely=0.8,relwidth=0.3,anchor='w')
-      self.e_max.insert(0,self.node.item.object.get_valeur_attribut('max'))
-      
-  def change_domaine(self,fr3):
-    valeur = self.domaine.get()
-    if valeur == 'discret' :
-      l_widgets = ['l_val_min','l_val_max','e_val_min','e_val_max']
-      self.detruit_widgets(l_widgets)
-      # into
-      #self.l_into = Label(fr3,text='Ensemble de valeurs : ')
-      #self.l_into.place(relx=0.2,rely=0.5,anchor='w')
-      self.e_into = Pmw.ScrolledListBox(fr3,
-                                        items=self.node.item.object.get_valeur_attribut('into'),
-                                        labelpos='w',
-                                        label_text= 'Ensemble de valeurs : ',
-                                        listbox_height = 3,
-                                        dblclickcommand = self.change_into)
-      self.e_into.place(relx=0.05,rely=0.6,relwidth=0.9,anchor='w')
-      #self.e_into.insert(0,self.node.item.object.get_valeur_attribut('into'))
-    elif valeur == 'continu':
-      l_widgets = ['l_into','e_into']
-      self.detruit_widgets(l_widgets)
-      if hasattr(self,'l_val_min'):
-        # on est déjà en mode 'continu' --> rien à faire
-        return
-      # val_min
-      self.l_val_min = Label(fr3,text='Valeur minimale : ')
-      self.l_val_min.place(relx=0.05,rely=0.5,anchor='w')
-      self.e_val_min = Entry(fr3)
-      self.e_val_min.place(relx=0.35,rely=0.5,relwidth=0.5,anchor='w')
-      self.e_val_min.bind("<Return>",lambda e,s=self : s.set_valeur_attribut('val_min',None))
-      self.e_val_min.bind("<KP_Enter>",lambda e,s=self : s.set_valeur_attribut('val_min',None))
-      self.set_valeur_attribut('val_min',self.get_valeur_attribut('val_min'))
-      # val_max
-      self.l_val_max = Label(fr3,text='Valeur maximale : ')
-      self.l_val_max.place(relx=0.05,rely=0.8,anchor='w')
-      self.e_val_max = Entry(fr3)
-      self.e_val_max.place(relx=0.35,rely=0.8,relwidth=0.5,anchor='w')
-      self.e_val_max.bind("<Return>",lambda e,s=self : s.set_valeur_attribut('val_max',None))
-      self.e_val_max.bind("<KP_Enter>",lambda e,s=self : s.set_valeur_attribut('val_max',None))
-      self.set_valeur_attribut('val_max',self.get_valeur_attribut('val_max'))
-
-# ------------------------------------------------------------------
-# Méthodes de validation des entrées faites par l'utilisateur
-# ------------------------------------------------------------------
-
-  def get_valeur_attribut(self,nom_attr):
-    """
-    Demande à l'item de retourner la valeur de l'attribut nom_attr
-    """
-    return self.node.item.get_valeur_attribut(nom_attr)
-  
-  def set_valeur_attribut(self,nom_attr,new_valeur):
-    """
-    Affecte la valeur new_valeur à l'attribut nom_attr
-    Vérifie si celle-ci est valide, sinon restaure l'ancienne
-    """
-    if new_valeur is None :
-      widget = getattr(self,'e_'+nom_attr)
-      if hasattr(widget,'getcurselection'):
-        new_valeur = widget.getcurselection()
-      else:
-        new_valeur = widget.get()
-    print "on affecte %s a %s" %(str(new_valeur),nom_attr)
-    self.node.item.set_valeur_attribut(nom_attr,new_valeur)
-    self.node.update()
-
-  def change_into(self):
-    """
-    Méthode activée par double clic sur la ListBox d'affichage des valeurs discrètes possibles :
-    permet de changer la liste de ces valeurs
-    """
-    showinfo("Fonction non encore disponible",
-             "Vous ne pouvez pas encore modifier la liste into par cette IHM")
-    
-class OBJECTItem(TreeItem):
-  def __init__(self,appli,labeltext,object,setfunction=None,objet_cata_ordonne = None):
-    self.appli = appli
-    self.labeltext = labeltext
-    self.object=object
-    self.setfunction = setfunction
-    self.objet_cata_ordonne = objet_cata_ordonne
-    
-  def GetLabelText(self):
-    return self.labeltext,None,None
-
-  def get_fr(self):
-    return ''
-  
-  def isMCList(self):
-    return 0
-
-  def isactif(self):
-    return 1
-
-  def add_commande_avant(self):
-    pass
-
-  def add_commande_apres(self):
-    pass
-
-  def set_valeur_attribut(self,nom_attr,new_valeur):
-    """
-    Affecte la valeur new_valeur à l'attribut nom_attr
-    Vérifie si celle-ci est valide, sinon restaure l'ancienne
-    """
-    old_valeur = self.object.get_valeur_attribut(nom_attr)
-    self.object.set_valeur_attribut(nom_attr,new_valeur)
-    verificateur = 'verif_'+nom_attr
-    if hasattr(self.object,verificateur):
-      if not getattr(self.object,verificateur)():
-        # la nouvelle valeur de nom_attr n'est pas valide : on restaure l'ancienne (sans vérification)
-        self.object.set_valeur_attribut(nom_attr,old_valeur)
-        print 'changement de valeur refuse'
-        return
-    print 'changement de valeur accepte'
-    self.object.init_modif()
-
-  def get_valeur_attribut(self,nom_attr):
-    """
-    Retourne la valeur de l'attribut nom_attr
-    """
-    return self.object.get_valeur_attribut(nom_attr)
-        
-class CATAItem(OBJECTItem):
-  def GetSubList(self):
-    sublist=[]
-    for fils in self.object.entites_fils:
-      item = make_objecttreeitem(self.appli,fils.objet.label + " : ",fils,objet_cata_ordonne=self.objet_cata_ordonne)
-      sublist.append(item)
-    return sublist
-  
-  def GetIconName(self):
-    if self.object.isvalid():
-      return 'ast-green-square'
-    else:
-      return 'ast-red-square'
-
-  def GetText(self):
-    return "Catalogue %s" %self.appli.code
-
-  def add_commande_avant(self):
-    pass
-
-  def add_commande_apres(self):
-    pass
-
-     
-def transforme_liste_dico(liste):
-  d={}
-  for item in liste :
-    d[item.nom]=item
-  return d
-      
-class OPERItem(OBJECTItem):
-  panel = OPERPanel
-  def GetSubList(self):
-    sublist=[]
-    # on classe les fils dans l'ordre du catalogue ...
-    l_cles_fils = self.get_liste_mc_ordonnee()
-    # on crée les items fils ...
-    dico_fils = transforme_liste_dico(self.object.entites_fils)
-    for k in l_cles_fils :
-      typ = TYPE_COMPLET(dico_fils[k])
-      if type(self.objet_cata_ordonne) == types.InstanceType :
-        objet_cata = self.objet_cata_ordonne.entites[k]
-      else :
-        objet_cata = self.objet_cata_ordonne.get(k,None)
-      item = make_objecttreeitem(self.appli,typ + " : ",dico_fils[k],objet_cata_ordonne = objet_cata)
-      sublist.append(item)
-    return sublist
-
-  def GetText(self):
-    #return self.object.nom
-    return self.object.get_valeur_attribut('nom')
-
-  def get_liste_mc_ordonnee(self):
-    return self.objet_cata_ordonne.ordre_mc
-
-  def GetIconName(self):
-    if self.object.isvalid():
-      return 'ast-green-square'
-    else:
-      return 'ast-red-square'
-
-  def additem(self,name,pos):
-      if isinstance(name,TreeItem) :
-          cmd=self.object.addentite(name.getObject(),pos)
-      else :
-          cmd = self.object.addentite(name,pos)
-      typ = TYPE_COMPLET(cmd)
-      item = make_objecttreeitem(self.appli,typ + " : ", cmd)
-      return item
-
-  def get_attribut(self,nom):
-    if nom == 'nature': return 'OPERATEUR'
-
-  def get_liste_mc_presents(self):
-    return []
-
-  def verif_condition_regles(self,liste):
-    return []
-  
-class PROCItem(OPERItem):
-  panel = OPERPanel
-  
-class MACROItem(OPERItem):
-  panel = OPERPanel
-    
-class SIMPItem(OPERItem):
-  panel = SIMPPanel
-  
-  def GetIconName(self):
-    if self.object.isvalid():
-      return 'ast-green-ball'
-    else:
-      return 'ast-red-ball'
-
-  def IsExpandable(self):
-    return 0
-
-  def GetSubList(self):
-    return []
-  
-class FACTItem(OPERItem):
-  def GetIconName(self):
-    if self.object.isvalid():
-      return 'ast-green-los'
-    else:
-      return 'ast-red-los'
-
-class BLOCItem(FACTItem): pass
-
-class TYPEItem(SIMPItem):
-  panel = TYPEPanel
-  def get_dico_attributs(self):
-    self.d_attributs = {}
-
-  def GetSubList(self):
-    return []
-
-  def IsExpandable(self):
-    return 0
-
-  def GetText(self):
-    return self.object.nom
-
-class NIVEAUItem(OPERItem):
-  def IsExpandable(self):
-      return 1
-
-  def get_liste_mc_ordonnee(self):
-    l=[]
-    for fils in self.object.entites_fils:
-      l.append(fils.nom)
-    return l
-  
-  def GetSubList(self):
-    sublist=[]
-    # on classe les fils dans l'ordre du catalogue ...
-    l_cles_fils = self.get_liste_mc_ordonnee()
-    # on crꥠles items fils ...
-    dico_fils = transforme_liste_dico(self.object.entites_fils)
-    for k in l_cles_fils :
-      typ = TYPE_COMPLET(dico_fils[k])
-      if type(self.objet_cata_ordonne) == types.InstanceType :
-        objet_cata = self.objet_cata_ordonne.entites[k]
-      else :
-        objet_cata = self.objet_cata_ordonne.get(k,None)
-      item = make_objecttreeitem(self.appli,typ + " : ",dico_fils[k],objet_cata_ordonne = objet_cata)
-      sublist.append(item)
-    return sublist
-  
-  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 self.labeltext,Fonte_Niveau,'#00008b'
-    
-  def GetIconName(self):
-    if self.object.isvalid():
-      return "ast-green-text"
-    else:
-      return 'ast-red-text'
-
-  def additem(self,name,pos):
-      if isinstance(name,TreeItem) :
-          cmd=self.object.addentite(name.getObject(),pos)
-      else :
-          cmd = self.object.addentite(name,pos)
-      typ = TYPE_COMPLET(obj)
-      item = make_objecttreeitem(self.appli,typ+ " : ", cmd)
-      return item
-
-  def suppitem(self,item) :
-    # item = item de l'ETAPE à supprimer du JDC
-    # item.getObject() = ETAPE ou _C
-    # self.object = JDC
-    itemobject=item.getObject()
-    if self.object.suppentite(itemobject):
-       if isinstance(itemobject,_C):
-          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 ''
-    
-class ATTRIBUTItem(SIMPItem):
-  def get_dico_attributs(self):
-    self.d_attributs = {}
-
-  def GetSubList(self):
-    return []
-
-  def IsExpandable(self):
-    return 0
-
-  def GetText(self):
-    return self.object
-
-  def GetIconName(self):
-    return 'aucune' 
-
-class CataEditeur:
-  def __init__(self,parent,appli,cata):
-    self.parent = parent
-    self.cata = definition_cata.CATALOGUE(cata)
-    self.appli = appli
-    self.top = Toplevel()
-    self.top.geometry("800x500")
-    self.top.title("Edition d'un catalogue")
-    self.init()
-
-  def close(self):
-    self.top.destroy()
-
-  def init(self):
-    self.nodes={}
-    self.creerbarremenus()
-    self.pane = Pmw.PanedWidget(self.top,
-                                hull_width = 800,
-                                hull_height = 500,
-                                orient = 'horizontal')
-    self.pane.add('canvas',min = 0.4, max = 0.6, size = 0.45)
-    self.pane.add('panel',min = 0.4, max = 0.6, size = 0.55)
-    self.pane.pack(expand =1, fill = 'both')
-    self.scrolledcanvas = Pmw.ScrolledCanvas(self.pane.pane('canvas'),
-                                             hull_width=1.,
-                                             hull_height=1.,
-                                             borderframe=1)
-    Pmw.Color.changecolor(self.scrolledcanvas.component('canvas'),background='gray95')
-    self.scrolledcanvas.pack(padx=10,pady=10,expand=1, fill="both")
-    self.item = CATAItem(self.appli,"Catalogue",
-                           self.cata,
-                          objet_cata_ordonne = self.appli.readercata.cata_ordonne_dico)
-
-    self.tree = Tree(self.appli,self.item,self.scrolledcanvas,command = self.select_node)
-    self.tree.draw()
-    self.node = self.tree.node_selected
-
-  def creerbarremenus(self) :
-      self.menubar=Menu(self.top)
-      self.filemenu=Menu(self.menubar,tearoff=0)
-      self.filemenu.add_command(label='Quitter',command=self.quit)
-
-      self.editmenu=Menu(self.menubar,tearoff=0)
-      #self.editmenu.add_command(label='Copier',command=self.copy)
-      #self.editmenu.add_command(label='Couper',command=self.cut)
-      #self.editmenu.add_command(label='Coller',command=self.paste)
-
-      self.affichagemenu=Menu(self.menubar,tearoff=0)
-      self.affichagemenu.add_command(label='Rapport de validation',
-                                     command = self.visuCR)
-      self.affichagemenu.add_command(label='shell',command = self.shell)
-      #self.affichagemenu.add_command(label='Fichier ࡰlat',command=self.visu_a_plat)
-      #self.affichagemenu.add_command(label='Fichier .py',command =self.visuJDC_py)
-      #self.affichagemenu.add_command(label='Fichier source',command = self.visu_txt_brut_JDC)
-      #self.affichagemenu.add_command(label='Param鵲es Eficas',command=self.affichage_fichier_ini)
-      
-      #self.optionmenu=Menu(self.menubar,tearoff=0)
-      #self.optionmenu.add_command(label='Catalogue d귥loppeur',command=self.choix_cata_developpeur)
-
-      self.menubar.add_cascade(label='Fichier',menu=self.filemenu)
-      self.menubar.add_cascade(label='Edition',menu=self.editmenu)
-      self.menubar.add_cascade(label='Jeu de commandes',menu=self.affichagemenu)
-      #self.menubar.add_cascade(label='Browsers',menu=self.browsermenu)
-      #self.menubar.add_cascade(label='Catalogue',menu=self.cataloguemenu)
-      #self.menubar.add_cascade(label='Options',menu=self.optionmenu)
-      self.top.configure(menu=self.menubar)
-      self.top.protocol("WM_DELETE_WINDOW",self.quit)
-      self.top.minsize(900,500)
-      self.top.geometry("900x500")
-
-  def shell(self,event=None):
-      import Interp
-      d={'j':self.tree.item.getObject()}
-      Interp.InterpWindow(d,parent=self.parent)
-      
-  def visuCR(self,mode='Cata'):
-    txt = str(self.cata.report())
-    titre="Rapport de validation du catalogue"
-    Fenetre(self.appli,titre=titre,texte=txt)
-  
-  def select_node(self,node):
-    self.nodes[node]=self.create_panel(node)
-
-  def create_panel(self,node):
-    if hasattr(node.item,"panel"):
-      return getattr(node.item,"panel")(self,self.pane.pane('panel'),node)
-      
-  def quit(self) :
-    self.top.destroy()
-    
-  def settitle(self):
-    self.top.wm_title("Browser de catalogue " )
-    self.top.wm_iconname("CataBrowser")
-
-dispatch = {
-    'OPER'   : OPERItem,
-    'PROC'   : PROCItem,
-    'MACRO'  : MACROItem,
-    'SIMP'   : SIMPItem,
-    'FACT'   : FACTItem,
-    'BLOC'   : BLOCItem,
-    'TYPE'   : TYPEItem,
-    'NIVEAU' : NIVEAUItem
-}
-
-def TYPE(o):
-  if isinstance(o,definition_cata.OPER_CATA):return 'OPER'
-  elif isinstance(o,definition_cata.PROC_CATA):return 'PROC'
-  elif isinstance(o,definition_cata.MACRO_CATA):return 'MACRO'
-  elif isinstance(o,definition_cata.SIMP_CATA):return 'SIMP'
-  elif isinstance(o,definition_cata.FACT_CATA):return 'FACT'
-  elif isinstance(o,definition_cata.BLOC_CATA):return 'BLOC'
-  elif isinstance(o,definition_cata.TYPE_CATA):return 'TYPE'
-  elif isinstance(o,definition_cata.NIVEAU_CATA) : return 'NIVEAU'
-  else:return type(o)
-
-def TYPE_COMPLET(o):
-  if isinstance(o,definition_cata.OPER_CATA):return "OPERATEUR"
-  elif isinstance(o,definition_cata.PROC_CATA):return "PROCEDURE"
-  elif isinstance(o,definition_cata.MACRO_CATA):return "MACRO"
-  elif isinstance(o,definition_cata.SIMP_CATA):return "Mot-clé SIMPLE"
-  elif isinstance(o,definition_cata.FACT_CATA):return "Mot-clé FACTEUR"
-  elif isinstance(o,definition_cata.BLOC_CATA):return "BLOC"
-  elif isinstance(o,definition_cata.TYPE_CATA):return "Type"
-  elif isinstance(o,definition_cata.NIVEAU_CATA):return "Niveau"
-  else: return "Inconnu ("+`type(o)`+")"
-  
-def make_objecttreeitem(appli,labeltext, object, setfunction=None,objet_cata_ordonne=None):
-    t = TYPE(object)
-    if dispatch.has_key(t):
-      c = dispatch[t]
-    else:
-      print 'on a un objet de type :',type(object),'  ',object
-      c = ATTRIBUTItem
-    return c(appli,labeltext, object, setfunction = setfunction,objet_cata_ordonne=objet_cata_ordonne)
-
-
-
diff --git a/Editeur/centerwindow.py b/Editeur/centerwindow.py
deleted file mode 100644 (file)
index 4acca2e..0000000
+++ /dev/null
@@ -1,53 +0,0 @@
-# -*- 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 contient la fonction utilitaire centerwindow
-   qui sert à centrer une fenetre
-"""
-import types
-
-def centerwindow(window,parent = 'avec'):
-    if parent =='avec':
-        parent = window.winfo_parent()
-        if type(parent) == types.StringType:
-            parent = window._nametowidget(parent)
-    # Find size of window.
-    window.update_idletasks()
-    width = window.winfo_width()
-    height = window.winfo_height()
-    if width == 1 and height == 1:
-        # If the window has not yet been displayed, its size is
-        # reported as 1x1, so use requested size.
-        width = window.winfo_reqwidth()
-        height = window.winfo_reqheight()
-    # Place in centre of screen:
-    if parent =='avec' :
-        x = (window.winfo_screenwidth() - width) / 2 - parent.winfo_vrootx()
-        y = (window.winfo_screenheight() - height) / 3 - parent.winfo_vrooty()
-    else:
-        x = (window.winfo_screenwidth() - width) / 2 
-        y = (window.winfo_screenheight() - height) / 3
-    if x < 0:
-        x = 0
-    if y < 0:
-        y = 0
-    window.geometry('+%d+%d' % (x, y))
-    
diff --git a/Editeur/change_comm.py b/Editeur/change_comm.py
deleted file mode 100755 (executable)
index 8b0a4bc..0000000
+++ /dev/null
@@ -1,167 +0,0 @@
-# -*- 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 patentier l'utilisateur
-"""
-# Modules Python
-import sys
-import os
-
-# Modules Eficas
-import import_code
-import session
-import prefs
-import convert
-import generator
-import string
-from utils import extension_fichier,stripPath, save_in_file
-
-class DUP :
-
-   def __init__(self,code):
-       """
-       """
-       self.format_fichier="python"
-       self.version_code=None
-       self.code=code
-
-       self.top=None
-       self.test=2
-       import configuration
-       self.CONFIGURATION=configuration.make_config(self,prefs.REPINI)
-
-       self.load_readercata()
-       self.cata=self.readercata.cata
-
-       self.JDC=None
-       self.JDCName=""
-       self.J2=None
-
-   def load_readercata(self):
-       mname='readercata'
-       module=__import__(mname,globals(),locals())
-       factory=getattr(module,mname.upper())
-       appli_composant=factory(self,self.top)
-       setattr(self,mname,appli_composant)
-
-
-   def openJDC(self,fichier):
-      if fichier :
-          self.fichier = fichier
-          e=extension_fichier(fichier)
-          self.JDCName=stripPath(fichier)
-          self.initialdir = os.path.dirname(os.path.abspath(fichier))
-      else :
-          return
-
-      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(fichier)
-         text=p.convert('exec',self)
-         if not p.cr.estvide(): 
-            print ("Erreur à la conversion")
-            print str(p.cr)
-            return
-
-      # On se met dans le repertoire ou se trouve le fichier de commandes
-      # pour trouver les eventuels fichiers include ou autres
-      # localises a cote du fichier de commandes
-      os.chdir(self.initialdir)
-      CONTEXT.unset_current_step()
-      J=self.cata[0].JdC(procedure=text,appli=self,
-                         cata=self.cata,cata_ord_dico=self.readercata.cata_ordonne_dico,
-                         nom = self.JDCName,
-                         rep_mat=self.CONFIGURATION.rep_mat,
-                         )
-
-      J.analyse()
-
-      txt_exception = J.cr.get_mess_exception()
-      if txt_exception :
-          # des exceptions ont été levées à la création du JDC 
-          # --> on affiche les erreurs mais pas le JDC
-          self.JDC=J
-          print("Erreur fatale au chargement de %s" %file)
-      else :
-          self.JDC=J
-
-   def modifieJDC(self,texte):
-         if texte == None or texte == "" : return
-         format="python"
-         lignes=string.split(texte,";")
-         textedecoup=""
-         for l in lignes :
-            textedecoup=textedecoup+l+'\n'
-         if convert.plugins.has_key(format):
-            p=convert.plugins[format]()
-            p.settext(textedecoup)
-            text=p.convert('exec',self)
-            print text
-         if not p.cr.estvide(): 
-            print ("Erreur à la conversion")
-            print str(p.cr)
-            return
-         self.J2=self.cata[0].JdC(procedure=text,appli=self,
-                         cata=self.cata,
-                         cata_ord_dico=self.readercata.cata_ordonne_dico,
-                         nom = self.JDCName+"2",
-                         rep_mat=self.CONFIGURATION.rep_mat,
-                         )
-         self.J2.definition.code = "MODIF"
-         self.J2.analyse()
-     
-
-   def saveJDC(self,fichierSortie):
-      """ 
-          Sauvegarde le JDC courant.
-          Retourne 1 si la sauvegarde s'est bien faite, 0 sinon.
-      """
-      if not hasattr(self,'JDC') : return 0
-
-      format="Modif"
-
-      if generator.plugins.has_key(format):
-         g=generator.plugins[format]()
-         jdc_formate=g.genermodifparam(self.JDC,self.J2)
-         if not g.cr.estvide():
-            self.affiche_infos("Erreur à la generation")
-            return 0
-      else:
-         self.affiche_infos("Format %s non reconnu" % format)
-         return 0
-
-      self.jdc_fini = string.replace(jdc_formate,'\r\n','\n')
-
-      if not save_in_file(fichierSortie,self.jdc_fini) :
-         self.affiche_infos("Problème à la sauvegarde du fichier")
-         return 0
-      else :
-         self.affiche_infos("sauvegarde effectuée")
-         return 1
-
-
-   def affiche_infos(self,mess):
-       print mess
-          
index c5a7c8466100efeaa141041f24f5b8bc7198f992..e49bc50add03472e53b6b368386594ba056b9747 100644 (file)
@@ -38,13 +38,17 @@ import os,glob,types
 # Ce dictionnaire est renseigné par la méthode charger_composants 
 composants = {}
 
-def charger_composants():
+def charger_composants(Ihm="TK"):
     """
         Cette fonction a pour but de charger tous les modules composants graphiques
         (fichiers compo*.py dans le même répertoire que ce module )
         et de remplir le dictionnaire composants utilisé par make_objecttreeitem
     """
-    repertoire=os.path.dirname(__file__)
+    reper=os.path.dirname(__file__)
+    if Ihm == "TK" :
+       repertoire=reper+"/../InterfaceTK"
+    else :
+       repertoire=reper+"/../InterfaceQT"
     listfich=glob.glob(os.path.join(repertoire, "compo*.py"))
     for fichier in listfich:
         m= os.path.basename(fichier)[:-3]
diff --git a/Editeur/compobase.py b/Editeur/compobase.py
deleted file mode 100644 (file)
index df539df..0000000
+++ /dev/null
@@ -1,3 +0,0 @@
-import Objecttreeitem
-treeitem = Objecttreeitem.ObjectTreeItem
-objet = None
diff --git a/Editeur/compobloc.py b/Editeur/compobloc.py
deleted file mode 100644 (file)
index d2f2f3a..0000000
+++ /dev/null
@@ -1,42 +0,0 @@
-# -*- 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 Tkinter import *
-import Pmw
-
-import Objecttreeitem
-import compofact
-
-
-class BLOCTreeItem(compofact.FACTTreeItem):
-  panel = compofact.FACTPanel
-
-  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/Editeur/compocomm.py b/Editeur/compocomm.py
deleted file mode 100644 (file)
index f0fdca5..0000000
+++ /dev/null
@@ -1,169 +0,0 @@
-# -*- 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 Tkinter import *
-import Pmw
-import string
-
-import Objecttreeitem
-import panels
-import fontes
-
-Fonte_Commentaire = fontes.standard_italique
-
-class COMMPanel(panels.OngletPanel):
-  
-  def init(self):
-    """
-    Initialise les frame des panneaux contextuels relatifs à un COMMENTAIRE
-    """
-    nb = Pmw.NoteBook(self,raisecommand=self.raisecmd)
-    nb.pack(fill = 'both', expand = 1)
-    self.nb=nb
-    nb.add('TexteComm', tab_text='Texte Commentaire')
-    nb.add('Commande', tab_text='Nouvelle Commande')
-    nb.add('Commentaire',tab_text='Paramètre/Commentaire')
-    self.makeCOMMPage(nb.page("TexteComm"))
-    self.makeCommandePage(nb.page("Commande"))
-    self.makeParamCommentPage_for_etape(nb.page("Commentaire"))
-    nb.tab('TexteComm').focus_set()
-    self.enlevebind()
-    self.creebind()
-    nb.setnaturalsize()
-    
-  def makeCOMMPage(self,page):
-    """
-    Crée la page qui permet d'afficher et d'éditer le texte du commentaire
-    """
-    self.frame_valeur = Frame(page)
-    self.frame_valeur.place(relwidth=0.9,relheight=0.9,relx=0.05,rely=0.05,anchor='nw')
-    self.widget_text = Pmw.ScrolledText(self.frame_valeur,
-                                        borderframe=1,
-                                        labelpos='n',
-                                        label_text = 'Texte du commentaire\n ')
-    self.widget_text.pack(side='top',expand=1,fill='both')
-    self.widget_text.configure(hscrollmode='dynamic',
-                               vscrollmode='dynamic')
-    self.make_buttons()
-    self.display_valeur()
-
-  def make_buttons(self):
-    """
-    Crée les boutons du panneau
-    """
-    #self.bouton_sup.place_forget()
-    #self.bouton_doc.place_forget()
-    #self.bouton_val = Button(self.fr_but,text='Valider',command=self.change_valeur,width=14)
-    #self.bouton_ann = Button(self.fr_but,text='Annuler',command=self.display_valeur,width=14)
-
-    #self.bouton_val.place(relx=0.25,rely=0.5,relheight=0.8,anchor='center')
-    #self.bouton_ann.place(relx=0.50,rely=0.5,relheight=0.8,anchor='center')
-    #self.bouton_sup.place(relx=0.75,rely=0.5,relheight=0.8,anchor='center')
-
-    self.bouton_sup.pack_forget()
-    self.bouton_doc.pack_forget()
-    self.bouton_val = Button(self.fr_but,text='Valider',command=self.change_valeur)
-    self.bouton_ann = Button(self.fr_but,text='Annuler',command=self.display_valeur)
-
-    self.bouton_val.pack(side='left',padx=5, pady=5)
-    self.bouton_ann.pack(side='left',padx=5, pady=5)
-    self.bouton_sup.pack(side='right',padx=5, pady=5)
-
-  def change_valeur(self):
-    """
-    Stocke la nouvelle valeur donnée par l'utilisateur comme valeur du commentaire
-    """
-    if self.parent.modified == 'n' : self.parent.init_modif()
-    new_valeur = self.widget_text.get()
-    self.node.item.set_valeur(new_valeur)
-    self.node.update()
-
-  def display_valeur(self):
-    """
-    Affiche dans self.widget_text la valeur de l'objet commentaire
-    (annule d'éventuelles modifications faite par l'utilisateur)
-    """
-    t=self.node.item.get_valeur()
-    try:
-        self.widget_text.settext(unicode(t))
-    except:
-        # Si probleme avec unicode
-        self.widget_text.settext(t)
-    
-class COMMTreeItem(Objecttreeitem.ObjectTreeItem):
-    panel = COMMPanel
-
-    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',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):
-      """
-      Afefcte 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( 'Citoyen : tu peux "commentariser" une commande MAIS PAS UN COMMENTAIRE' )
-  
-import Extensions
-treeitem =COMMTreeItem
-objet = Extensions.commentaire.COMMENTAIRE    
diff --git a/Editeur/compocommandecomm.py b/Editeur/compocommandecomm.py
deleted file mode 100644 (file)
index bbc3a47..0000000
+++ /dev/null
@@ -1,182 +0,0 @@
-# -*- 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
-from Tkinter import *
-import Pmw
-import string
-from widgets import showerror
-
-import Objecttreeitem
-import panels
-import fontes
-
-Fonte_Commentaire = fontes.standard_italique
-
-class COMMANDE_COMMPanel(panels.OngletPanel):
-  """
-  Classe servant à définir le panel associé à une commande commentarisée
-  """
-  def init(self):
-    """
-    Initialise les frame des panneaux contextuels relatifs à une commande commentarisée
-    """
-    panneau=Frame(self)
-    panneau.pack(expand=1,fill='both')
-    self.make_buttons()
-    self.makeCOMMPage(panneau)
-    self.enlevebind()
-
-  def makeCOMMPage(self,page):
-    """
-    Crée la page qui permet d'afficher et d'éditer le texte de la commande commentarisée
-    """
-    self.frame_valeur = Frame(page)
-    self.frame_valeur.place(relwidth=0.9,relheight=0.9,relx=0.05,rely=0.05,anchor='nw')
-    self.widget_text = Pmw.ScrolledText(self.frame_valeur,
-                                        borderframe=1,
-                                        labelpos='n',
-                                        label_text = 'Texte de la commande\n ')
-    self.widget_text.pack(side='top',expand=1,fill='both')
-    self.widget_text.configure(hscrollmode='dynamic',
-                               vscrollmode='dynamic')
-    self.display_valeur()
-
-  def make_buttons(self):
-    """
-    Crée les boutons du panneau
-    """
-    #self.bouton_sup.place_forget()
-    #self.bouton_doc.place_forget()
-    #self.bouton_val = Button(self.fr_but,text='Valider',command=self.change_valeur,width=14)
-    #self.bouton_ann = Button(self.fr_but,text='Annuler',command=self.display_valeur,width=14)
-    #self.bouton_unc = Button(self.fr_but,text='Décommentariser',command=self.uncomment,width=14)
-
-    #self.bouton_val.place(relx=0.1,rely=0.5,relheight=1,relwidth=0.20,anchor='center')
-    #self.bouton_ann.place(relx=0.30,rely=0.5,relheight=1,relwidth=0.20,anchor='center')
-    #self.bouton_sup.place(relx=0.50,rely=0.5,relheight=1,relwidth=0.20,anchor='center')
-    #self.bouton_unc.place(relx=0.75,rely=0.5,relheight=1,relwidth=0.25,anchor='center')
-
-    self.bouton_sup.pack_forget()
-    self.bouton_doc.pack_forget()
-    self.bouton_val = Button(self.fr_but,text='Valider',command=self.change_valeur)
-    self.bouton_ann = Button(self.fr_but,text='Annuler',command=self.display_valeur)
-    self.bouton_unc = Button(self.fr_but,text='Décommentariser',command=self.uncomment)
-    self.bouton_val.pack(side='left',padx=5, pady=5)
-    self.bouton_ann.pack(side='left',padx=5, pady=5)
-    self.bouton_sup.pack(side='left',padx=5, pady=5)
-    self.bouton_unc.pack(side='right',padx=5, pady=5)
-
-  def change_valeur(self):
-    """
-    Stocke la nouvelle valeur donnée par l'utilisateur comme valeur de la commande commentarisée
-    """
-    if self.parent.modified == 'n' : self.parent.init_modif()
-    new_valeur = self.widget_text.get()
-    self.node.item.set_valeur(new_valeur)
-    self.node.update()
-
-  def display_valeur(self):
-    """
-    Affiche dans self.widget_text la valeur de la commande commentarisée
-    (annule d'éventuelles modifications faite par l'utilisateur)
-    """
-    self.widget_text.settext(self.node.item.get_valeur())
-
-  def uncomment(self):
-      """
-      Réalise la décommentarisation de self
-      """
-      try:
-          pos=self.node.parent.children.index(self.node)
-          commande,nom = self.node.item.uncomment()
-          self.node.parent.children[pos].select()
-      except Exception,e:
-          showerror("Erreur !",str(e))
-          return
-      #self.parent.appli.bureau.JDCDisplay_courant.ReplaceObjectNode(self.node,commande,nom)
-    
-class COMMANDE_COMMTreeItem(Objecttreeitem.ObjectTreeItem):
-    panel = COMMANDE_COMMPanel
-
-    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 'commande commentarisée',Fonte_Commentaire,None
-
-    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()
-      except Exception,e:
-        traceback.print_exc()
-        raise e
-      return commande,nom
-  
-import Accas
-treeitem =COMMANDE_COMMTreeItem
-objet = Accas.COMMANDE_COMM    
diff --git a/Editeur/compoerror.py b/Editeur/compoerror.py
deleted file mode 100644 (file)
index 814782c..0000000
+++ /dev/null
@@ -1,45 +0,0 @@
-# -*- 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
-import Objecttreeitem
-import panels
-
-class ERRORPanel(panels.Panel_Inactif):
-    def creer_texte(self):
-        texte = """Le noeud sélectionné correspond à un objet erroné """
-        label = Label(self,text=texte,justify='center')
-        label.place(relx=0.5,rely=0.4,relwidth=0.8,anchor='center')
-        bouton = Button(self,text = "Supprimer", command=self.supprimer)
-        bouton.place(relx=0.5,rely=0.5,anchor='center')
-
-class ERRORTreeItem(Objecttreeitem.AtomicObjectTreeItem):
-    panel = ERRORPanel
-    def GetIconName(self):
-        return "ast-red-ball"
-
-
-treeitem =ERRORTreeItem
-objet = ErrorObj
-
diff --git a/Editeur/compofact.py b/Editeur/compofact.py
deleted file mode 100644 (file)
index 51b3673..0000000
+++ /dev/null
@@ -1,150 +0,0 @@
-# -*- 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 Pmw
-import Objecttreeitem
-import panels
-
-class FACTPanel(panels.OngletPanel) :
-  def init(self) :
-    nb = Pmw.NoteBook(self,raisecommand=self.raisecmd)
-    nb.pack(fill = 'both', expand = 1) 
-    self.nb=nb
-    nb.add('Mocles', tab_text='Ajouter mots-clés')
-    panneau=Pmw.PanedWidget(nb.page("Mocles"),
-                            orient='horizontal')
-    panneau.add('left',min=0.4,max=0.6,size=0.5)
-    panneau.add('right',min=0.4,max=0.6,size=0.5)
-    panneau.pack(expand=1,fill='both')
-    self.makeMoclesPage(panneau.pane('left'))
-    self.makeReglesPage(panneau.pane('right'))
-    nb.tab('Mocles').focus_set()
-    nb.setnaturalsize()
-    self.enlevebind()
-    self.creebind()
-    self.affiche()
-
-import treewidget
-class Node(treewidget.Node):
-    def doPaste(self,node_selected):
-        objet_a_copier = self.item.get_copie_objet()
-        child=node_selected.doPaste_MCF(objet_a_copier)
-        return child
-
-    def doPaste_MCF(self,objet_a_copier):
-        child = self.parent.append_child(objet_a_copier,
-                                              pos=self.item,
-                                              retour='oui')
-        return child
-
-
-class FACTTreeItem(Objecttreeitem.ObjectTreeItem):
-  panel = FACTPanel
-  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):
-    #print "compofact.additem",name,pos
-    objet = self.object.addentite(name,pos)
-    return objet
-
-  def suppitem(self,item) :
-      """ 
-         Cette methode a pour fonction de supprimer l'item passé en argument
-         des fils de l'item FACT qui est son pere
-           - item = item du MOCLE à supprimer du MOCLE père
-           - 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/Editeur/compoformule.py b/Editeur/compoformule.py
deleted file mode 100644 (file)
index d134713..0000000
+++ /dev/null
@@ -1,411 +0,0 @@
-# -*- 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 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 modules Python
-from Tkinter import *
-import Pmw
-import string
-
-# import modules EFICAS
-import widgets
-import panels
-import fontes
-import compooper
-
-Fonte_TITRE = fontes.standard_gras_souligne
-
-
-class FORMULEPanel(panels.OngletPanel):
-  """
-  Classe servant à construire le panneau associé à un paramètre.
-  C'est au moyen de ce panneau que l'utilisateur peut accéder
-  aux nom et valeur du paramètre en vue éventuellement de les
-  modifier.
-  """
-
-  def init(self):
-    nb = Pmw.NoteBook(self,raisecommand=self.raisecmd)
-    nb.pack(fill = 'both', expand = 1)
-    self.nb=nb
-    nb.add('Formule', tab_text='Définition Formule')
-    nb.add('Commande', tab_text='Nouvelle Commande')
-    nb.add('Commentaire',tab_text='Paramètre/Commentaire')
-    self.makeFormulePage(nb.page("Formule"))
-    self.makeCommandePage(nb.page("Commande"))
-    self.makeParamCommentPage_for_etape(nb.page("Commentaire"))
-    nb.tab('Formule').focus_set()
-    self.enlevebind()
-    self.creebind()
-    nb.setnaturalsize()
-    
-  def makeFormulePage(self,page):
-    """
-    Crée la page qui permet d'afficher et d'éditer le texte de la FORMULE
-    """
-    self.frame_valeur = Frame(page)
-    self.frame_valeur.pack(fill='both',expand=1)
-    #self.frame_valeur.place(relwidth=0.95,relheight=0.95,relx=0.05,rely=0.05,anchor='nw')
-    #self.frame_valeur.place(relwidth=0.9,relheight=0.9,relx=0.05,rely=0.05,anchor='nw')
-    # affichage du titre du panneau
-    self.titre = StringVar()
-    self.titre.set("FORMULE "+self.node.item.get_nom())
-
-    self.entry_nom = Entry(self.frame_valeur)
-    #Label(self.frame_valeur,textvariable=self.titre,font=Fonte_TITRE).place(relx=0.5,rely=0.,anchor='n')
-    Label(self.frame_valeur,textvariable=self.titre,font=Fonte_TITRE).grid(row=0,columnspan=2,padx=5,pady=5)
-    # création des labels et entries associés aux nom, type retourné, arguments et corps de la FORMULE
-    
-    #Label(self.frame_valeur,text= 'Nom de la formule : ').place(relx=0.,rely=0.1)
-    Label(self.frame_valeur,text= 'Nom de la formule : ').grid(row=1,sticky=W,padx=5,pady=5)
-    #Label(self.frame_valeur,text= 'Arguments : ').place(relx=0.,rely=0.40)
-    Label(self.frame_valeur,text= 'Arguments : ').grid(row=2,sticky=W,padx=5,pady=5)
-    self.entry_arg = Entry(self.frame_valeur)
-    #Label(self.frame_valeur,text= 'Expression : ').place(relx=0.,rely=0.65)
-    Label(self.frame_valeur,text= 'Expression : ').grid(row=4,sticky=W,padx=5,pady=5)
-    self.entry_exp = Entry(self.frame_valeur)
-
-    # binding sur les entries
-    self.entry_nom.bind("<Return>",self.verif_nom)
-    self.entry_nom.bind("<KP_Enter>",self.verif_nom)
-    self.entry_arg.bind("<Return>",self.verif_arguments)
-    self.entry_arg.bind("<KP_Enter>",self.verif_arguments)
-    self.entry_exp.bind("<Return>",self.verif_corps)
-    self.entry_exp.bind("<KP_Enter>",self.verif_corps)
-    # affichage des entries
-    #self.entry_nom.place(relx=0.35,rely=0.10,relwidth=0.2)
-    self.entry_nom.grid(row=1,column=1,sticky=W,padx=5,pady=5)
-    #self.entry_arg.place(relx=0.35,rely=0.40,relwidth=0.4)
-    self.entry_arg.grid(row=2,column=1,sticky=W,padx=5,pady=5)
-
-    # affichage d'une phrase d'aide pour les arguments
-    aide = """Entrer les arguments sous la forme
-de VARIABLES séparées par des virgules (,)
-Exemple X,Y,Z """
-    #Label(self.frame_valeur,text=aide, justify="l").place(relx=0.5,rely=0.47,anchor='n') 
-    Label(self.frame_valeur,text=aide, justify="l").grid(row=3,columnspan=2,padx=5,pady=5)
-
-    #self.entry_exp.place(relx=0.35,rely=0.65,relwidth=0.60)
-    self.entry_exp.grid(row=4,column=1,sticky=W,padx=5,pady=5)
-    # affichage d'une phrase d'aide pour l'expression
-    aide = """Un retour de chariot dans une zone de saisie vous permet de vérifier si
-la valeur que vous avez entrée est valide.
-Ce n'est qu'après avoir appuyé sur le bouton Valider que les nouvelles
-valeurs seront effectivement prises en compte."""
-    #Label(self.frame_valeur,text=aide).place(relx=0.5,rely=0.75,anchor='n')
-    Label(self.frame_valeur,text=aide).grid(row=5,columnspan=2,padx=5,pady=5)
-    self.frame_valeur.columnconfigure(1,weight=1)
-
-    # affichage des nom, type retourné, arguments et corps de la FORMULE
-    self.display_valeur()
-    # affichage des boutons
-    self.make_buttons()
-    # entry_nom prend le focus
-    self.entry_nom.focus()
-
-  def make_buttons(self):
-    """
-    Crée les boutons du panneau
-    """
-    #self.bouton_sup.place_forget()
-    #self.bouton_doc.place_forget()
-    #self.bouton_val = Button(self.fr_but,text='Valider',command=self.change_valeur,width=14)
-    #self.bouton_ann = Button(self.fr_but,text='Annuler',command=self.display_valeur,width=14)
-
-    #self.bouton_val.place(relx=0.15,rely=0.5,relheight=0.8,anchor='center')
-    #self.bouton_ann.place(relx=0.40,rely=0.5,relheight=0.8,anchor='center')
-    #self.bouton_sup.place(relx=0.65,rely=0.5,relheight=0.8,anchor='center')
-    #self.bouton_doc.place(relx=0.90,rely=0.5,relheight=0.8,anchor='center')
-
-    self.bouton_sup.pack_forget()
-    self.bouton_doc.pack_forget()
-    self.bouton_val = Button(self.fr_but,text='Valider',command=self.change_valeur)
-    self.bouton_ann = Button(self.fr_but,text='Annuler',command=self.display_valeur)
-
-    self.bouton_val.pack(side='left',padx=5, pady=5)
-    self.bouton_ann.pack(side='left',padx=5, pady=5)
-    self.bouton_sup.pack(side='left',padx=5, pady=5)
-    self.bouton_doc.pack(side='right',padx=5, pady=5)
-
-  def change_valeur(self):
-    """
-    Stocke la nouvelle FORMULE décrite par l'utilisateur
-    """
-    if self.parent.modified == 'n' : self.parent.init_modif()
-    # on récupère les nouveaux nom, type retourné, arguments et corps de la FORMULE
-    new_nom = self.entry_nom.get()
-    new_typ="REEL" 
-    new_arg = self.entry_arg.get()
-    new_exp = self.entry_exp.get()
-    self.verif_arguments()
-    self.verif_corps()
-    # on essaie de les stocker
-    test,erreur = self.node.item.save_formule(new_nom,new_typ,new_arg,new_exp)
-    if test :
-        # on a pu stocker les nouveaux paramètres : il faut rafraîchir l'affichage
-        self.node.update()
-        self.display_valeur()
-        self.parent.appli.affiche_infos("FORMULE %s modifiée" %self.node.item.get_nom())
-    else:
-        # la formule est incorrecte : on affiche les erreurs
-        widgets.showerror("Formule incorrecte",erreur)
-        self.parent.appli.affiche_infos("FORMULE %s non modifiée" %self.node.item.get_nom())
-    
-  def display_valeur(self):
-    """
-    Affiche dans self.widget_text de la valeur de l'objet FORMULE
-    (annule d'éventuelles modifications faite par l'utilisateur)
-    """
-    # on efface tout texte affiché dans les entries
-    self.entry_nom.delete(0,END)
-    self.entry_arg.delete(0,END)
-    self.entry_exp.delete(0,END)
-    # on rafraîchit le titre du panneau
-    self.titre.set('FORMULE '+self.node.item.get_nom())
-    # on insére les nouveaux nom, type retourné, arguments et corps de la FORMULE
-    nom = self.node.item.get_nom()
-    if nom != '':
-        self.entry_nom.insert(END,nom)
-    args = self.node.item.get_args()
-    if args:
-        texte_args=""
-        for i in args :
-            if texte_args != "" :
-               texte_args = texte_args +","
-            texte_args=texte_args + i
-        self.entry_arg.insert(END,texte_args)
-    corps = self.node.item.get_corps()
-    if corps :
-        self.entry_exp.insert(END,self.node.item.get_corps())
-
-  def verif_nom(self,event=None):
-        """
-        Lance la vérification du nom présent dans entry_nom
-        """
-        nom = self.entry_nom.get()
-        if nom == '':
-            test,erreur = 0,"Aucun nom fourni !"
-        else:
-            test,erreur = self.node.item.verif_nom(nom)
-        if not test:
-            widgets.showerror("Nom invalide",erreur)
-            self.entry_nom.focus()
-            self.entry_nom.selection_range(0,END)
-            self.parent.appli.affiche_infos("%s n'est pas un nom valide pour une FORMULE" %nom)
-        else:
-            self.parent.appli.affiche_infos("%s est un nom valide pour une FORMULE" %nom)
-            self.entry_arg.focus()
-
-  def verif_arguments(self,event=None):
-        """
-        Lance la vérification des arguments présents dans entry_arg
-        """
-        arguments = self.entry_arg.get()
-        if arguments == '' :
-            test,erreur = 0,"Aucun argument fourni"
-        else:
-            test,erreur = self.node.item.verif_arguments(arguments)
-        if not test:
-            widgets.showerror("Argument(s) invalide(s)",erreur)
-            self.entry_arg.focus()
-            self.entry_arg.selection_range(0,END)
-            self.parent.appli.affiche_infos("Argument(s) invalide(s) pour une FORMULE")
-        else:
-            self.parent.appli.affiche_infos("Argument(s) valide(s) pour une FORMULE")
-            self.entry_exp.focus()
-
-  def verif_corps(self,event=None):
-        """
-        Lance la vérification du corps de formule présent dans entry_exp
-        """
-        new_nom = self.entry_nom.get()
-        new_typ="REEL"
-        new_arg = self.entry_arg.get()
-        new_exp = self.entry_exp.get()
-        if new_exp == '':
-            test,erreur = 0,"Aucune expression fournie !"
-        else:
-            test,erreur = self.node.item.verif_formule_python((new_nom,new_typ,new_arg,new_exp))
-        if not test:
-            widgets.showerror("Corps de FORMULE invalide",erreur)
-            self.entry_exp.focus()
-            self.entry_exp.selection_range(0,END)
-            self.parent.appli.affiche_infos("Corps de FORMULE invalide")
-        else:
-            self.parent.appli.affiche_infos("Corps de FORMULE valide")
-            
-class FORMULETreeItem(compooper.EtapeTreeItem):
-    """
-    Classe servant à définir l'item porté par le noeud de l'arbre d'EFICAS
-    qui représente la FORMULE
-    """
-    panel = FORMULEPanel
-
-    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 à 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'icône à 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 à 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,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éjà 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/Editeur/compojdc.py b/Editeur/compojdc.py
deleted file mode 100644 (file)
index 8572c13..0000000
+++ /dev/null
@@ -1,168 +0,0 @@
-# -*- 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 Pmw
-import Objecttreeitem
-import panels
-
-from widgets import ListeChoix
-
-class JDCPanel(panels.OngletPanel):
-  def init(self):
-      """ Initialise les frame des panneaux contextuels relatifs à un JDC """
-      panneau=Pmw.PanedWidget(self,orient='horizontal')
-      panneau.add('left',min=0.4,max=0.6,size=0.5)
-      panneau.add('right',min=0.4,max=0.6,size=0.5)
-      panneau.pack(expand=1,fill='both')
-      self.bouton_com.pack_forget()
-      self.makeJDCPage(panneau.pane('left'))
-      self.makeReglesPage(panneau.pane('right'))
-      self.enlevebind()
-    
-  def makeReglesPage(self,page) :
-    regles = []
-    regles = self.node.item.get_regles()
-    texte_regles = []
-    l_regles_en_defaut=[]
-    if len(regles) > 0:
-      l_noms_etapes = self.node.item.get_l_noms_etapes()
-      i = 0
-      for regle in regles :
-        texte_regles.append(regle.gettext())
-        texte,test = regle.verif(l_noms_etapes)
-        if test == 0 : l_regles_en_defaut.append(i)
-        i = i+1
-    Liste = ListeChoix(self,page,texte_regles,liste_marques=l_regles_en_defaut,active='non',titre="Règles")
-    Liste.affiche_liste()
-    # aide associée au panneau
-    bulle_aide="""Ce panneau contient la liste des règles qui s'appliquent à l'objet
-    en cours d'édition.
-    - en noir : règles valides
-    - en rouge : règles violées"""
-    Liste.MCbox.bind("<Button-3>", lambda e,s=self,a=bulle_aide : s.parent.appli.affiche_aide(e,a))
-    Liste.MCbox.bind("<ButtonRelease-3>",self.parent.appli.efface_aide)
-
-import treewidget
-class Node(treewidget.Node):
-    def doPaste_Commande(self,objet_a_copier):
-        """
-          Réalise la copie de l'objet passé en argument qui est nécessairement
-          une commande
-        """
-        #child = self.item.append_child(objet_a_copier,pos='first')
-        child = self.append_child(objet_a_copier,pos='first',retour='oui')
-        #if child is None : return 0
-        return child
-
-
-class JDCTreeItem(Objecttreeitem.ObjectTreeItem):
-  panel = JDCPanel
-  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):
-      #print "get_liste_cmd",self.object.niveau.definition
-      listeCmd = self.object.niveau.definition.get_liste_cmd()
-      return listeCmd
-
-import Accas
-treeitem =JDCTreeItem
-objet = Accas.JDC    
diff --git a/Editeur/compomacro.py b/Editeur/compomacro.py
deleted file mode 100644 (file)
index ba42307..0000000
+++ /dev/null
@@ -1,311 +0,0 @@
-# -*- 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 os,sys,string
-import types
-import Tkinter
-import Pmw
-import traceback
-
-# Modules Eficas
-import Objecttreeitem
-import panels
-import fontes
-import compooper
-import convert
-from widgets import askopenfilename
-from widgets import Fenetre,FenetreYesNo
-from widgets import showinfo,showerror
-
-#
-__version__="$Name:  $"
-__Id__="$Id: compomacro.py,v 1.25.10.1 2006/11/15 17:59:30 cchris Exp $"
-#
-
-class MACROPanel(panels.OngletPanel):
-  def init(self):
-    nb = Pmw.NoteBook(self,raisecommand=self.raisecmd)
-    nb.pack(fill = 'both', expand = 1)
-    self.nb=nb
-    nb.add('Mocles', tab_text='Ajouter mots-clés')
-    typsd=self.node.item.object.get_type_produit()
-    ficini = self.node.item.wait_fichier_init()
-    if typsd != None:
-      nb.add('Concept', tab_text='Nommer concept')
-    if ficini == 1:
-      nb.add('Fichierinit',tab_text = 'Fichier %s' %self.node.item.get_nom())
-    nb.add('Commande', tab_text='Nouvelle Commande')
-    nb.add('Commentaire',tab_text='Paramètre/Commentaire')
-    panneau=Pmw.PanedWidget(nb.page("Mocles"),
-                            orient='horizontal')
-    panneau.add('left',min=0.4,max=0.6,size=0.5)
-    panneau.add('right',min=0.4,max=0.6,size=0.5)
-    panneau.pack(expand=1,fill='both')
-    self.makeCommandePage(nb.page("Commande"))
-    if typsd != None:
-      self.makeConceptPage(nb.page("Concept"))
-    if ficini == 1 :
-      self.makeFichierPage(nb.page('Fichierinit'))
-    self.makeMoclesPage(panneau.pane('left'))
-    self.makeReglesPage(panneau.pane('right'))
-    self.makeParamCommentPage_for_etape(nb.page("Commentaire"))
-    nb.tab('Mocles').focus_set()
-    nb.setnaturalsize()
-    self.enlevebind()
-    self.creebind()
-    self.affiche()
-
-  def makeFichierPage(self,page):
-    """
-    Affiche la page d'onglet correspondant au changement du fichier
-    dont a besoin la macro
-    """
-    titre = Tkinter.Label(page,text="La commande %s requiert un fichier " %self.node.item.get_nom())
-    titre.place(relx=0.5,rely=0.2,anchor='center')
-    frameMain=Tkinter.Frame(page)
-    frameMain.place(relx=0.5,rely=0.4,anchor='center',relwidth=1.)
-    Tkinter.Label(frameMain,text="Fichier :").pack(side='left',padx=5)
-    self.entry = Tkinter.Entry(frameMain,relief='sunken',bg='white')
-    self.entry.pack(side='left',padx=5,fill='x',expand=1)
-    frameButtons=Tkinter.Frame(page)
-    but1=Tkinter.Button(frameButtons,text='Valider',command = self.change_fichier_init)
-    but2=Tkinter.Button(frameButtons,text='Browse',command = self.browse_fichier_init)
-    but3=Tkinter.Button(frameButtons,text='Annuler',command = self.annule_fichier_init)
-    but1.grid(row=0,column=0,padx=5,pady=5)
-    but2.grid(row=0,column=1,padx=5,pady=5)
-    but3.grid(row=0,column=2,padx=5,pady=5)
-    frameButtons.place(relx=0.5,rely=0.6,anchor='center')
-
-    if hasattr(self.node.item.object,'fichier_ini'):
-      if self.node.item.object.fichier_ini :
-        self.entry.insert(0,self.node.item.object.fichier_ini)
-    self.entry.focus()
-
-  def convert_file(self,file):
-     """
-         Methode pour convertir le fichier file dans le format courant
-     """
-     format=self.parent.appli.format_fichier.get()
-     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.parent.appli.affiche_infos("Erreur à la conversion")
-            Fenetre(self,
-                    titre="compte-rendu d'erreurs, EFICAS ne sait pas convertir ce fichier",
-                    texte = str(p.cr))
-            return None
-         return text
-     else:
-         # Il n'existe pas c'est une erreur
-         self.parent.appli.affiche_infos("Type de fichier non reconnu")
-         showerror("Type de fichier non reconnu","EFICAS ne sait pas ouvrir ce type de fichier")
-         return None
-
-  def change_fichier_init(self,event=None):
-    """ 
-        Effectue le changement de fichier d'initialisation s'il est valide 
-    """
-    new_fic = self.entry.get()
-    if not os.path.isfile(new_fic) :
-      showinfo("Fichier introuvable","Le fichier que vous avez saisi\n"+
-               "n'est pas un nom de fichier valide !")
-      self.parent.appli.affiche_infos("Fichier introuvable")
-      return
-    # On convertit le fichier
-    text=self.convert_file(new_fic)
-    # Si probleme a la lecture-conversion on arrete le traitement
-    if not text:
-       return
-
-    try:
-      self.node.item.object.change_fichier_init(new_fic,text)
-      self.parent.appli.affiche_infos("Fichier %s modifié" %self.node.item.get_nom())
-    except:
-      # Erreurs lors de l'evaluation de text dans un JDC auxiliaire
-      self.parent.appli.affiche_infos("Fichier invalide")
-      l=traceback.format_exception_only("Fichier invalide",sys.exc_info()[1])
-      f=FenetreYesNo(self.parent.appli,titre="Fichier invalide : voulez vous retablir l ancien fichier ?",
-                             texte="Erreur dans l'interprétation du nouveau fichier ...\n\n"+string.join(l),
-                             yes="Retablir",no="Changer")
-      f.wait()
-      reponse=f.result
-      if reponse:
-         # On retablit l'ancien fichier
-         self.entry.delete(0,Tkinter.END)
-         self.node.item.object.restore_fichier_init()
-         self.parent.appli.affiche_infos("Fichier invalide ... Ancien fichier restauré")
-         fic=self.node.item.object.fichier_ini
-         if fic:
-             self.entry.insert(0,fic)
-      else:
-         self.node.item.object.force_fichier_init()
-         self.parent.appli.affiche_infos("Fichier invalide ... Nouveau fichier mémorisé")
-
-  def annule_fichier_init(self,event=None):
-    """ Restaure dans self.entry le nom de fichier_init"""
-    self.entry.delete(0,Tkinter.END)
-    if self.node.item.object.fichier_ini:
-       self.entry.insert(0,self.node.item.object.fichier_ini)
-
-  def browse_fichier_init(self,event=None):
-    """ 
-         Propose à l'utilisateur une Bsf et retourne le fichier 
-         sélectionné dans self.entry 
-    """
-    file = askopenfilename(title="Choix du fichier %s" %self.node.item.get_nom())
-    if file :
-      self.entry.delete(0,Tkinter.END)
-      self.entry.insert(0,file)
-    
-  def update_panel(self):
-    if hasattr(self,"entry"):
-       self.annule_fichier_init()
-    
-class MACROTreeItem(compooper.EtapeTreeItem):
-  """ Cette classe hérite d'une grande partie des comportements
-      de la classe compooper.EtapeTreeItem
-  """
-  panel=MACROPanel
-
-class INCLUDETreeItemBase(MACROTreeItem):
-  rmenu_specs=[("View","makeView"),
-               ("Edit","makeEdit"),
-              ]
-
-  def __init__(self,appli, labeltext, object, setfunction):
-    MACROTreeItem.__init__(self,appli, labeltext, object, setfunction)
-
-  def iscopiable(self):
-      """
-      Retourne 1 si l'objet est copiable, 0 sinon
-      """
-      return 0
-
-  def makeEdit(self,appli,node):
-    #print "makeEdit",self.object,self.object.nom
-    #print "makeEdit",self.object.jdc_aux,self.object.jdc_aux.nom
-    #print "makeEdit",self.object.jdc_aux.context_ini
-    if self.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.object.text_error
-        Fenetre(self,titre="Include non editable",texte=msg,wrap='none')
-        return
-
-    if not hasattr(self.object,"jdc_aux") or self.object.jdc_aux is None:
-       #L'include n'est pas initialise
-       self.object.build_include(None,"")
-
-    # On cree un nouvel onglet dans le bureau
-    appli.bureau.ShowJDC(self.object.jdc_aux,self.object.jdc_aux.nom,
-                             label_onglet=None,
-                             JDCDISPLAY=macrodisplay.MACRODISPLAY)
-
-  def makeView(self,appli,node):
-    if not hasattr(self.object,"jdc_aux") or self.object.jdc_aux is None:
-         showerror("Include vide",
-                 "L'include doit etre correctement initialisé pour etre visualisé")
-         return
-
-    nom=self.object.nom
-    if hasattr(self.object,'fichier_ini'):
-       if self.object.fichier_ini is None:
-          nom=nom+' '+"Fichier non défini"
-       else:
-          nom=nom+' '+self.object.fichier_ini
-    macdisp=macrodisplay.makeMacroDisplay(appli,self,nom)
-
-class INCLUDEPanel(MACROPanel):
-  def makeFichierPage(self,page):
-    """
-    Affiche la page d'onglet correspondant au changement du fichier INCLUDE
-    """
-    if not hasattr(self.node.item.object,'fichier_ini'):
-       titre = Tkinter.Label(page,text="L'INCLUDE n'a pas de fichier associé\nIl faut d'abord choisir un numero d'unité " )
-       titre.place(relx=0.5,rely=0.5,anchor='center')
-    else:
-       MACROPanel.makeFichierPage(self,page)
-
-class INCLUDETreeItem(INCLUDETreeItemBase):
-   panel=INCLUDEPanel
-
-class POURSUITETreeItem(INCLUDETreeItemBase): 
-  def makeEdit(self,appli,node):
-    if self.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.object.text_error
-        Fenetre(self,titre="Poursuite non editable",texte=msg,wrap='none')
-        return
-
-    if not hasattr(self.object,"jdc_aux") or self.object.jdc_aux is None:
-       #La poursuite n'est pas initialisee
-       text="""DEBUT()
-FIN()"""
-       self.object.build_poursuite(None,text)
-
-    # On cree un nouvel onglet dans le bureau
-    appli.bureau.ShowJDC(self.object.jdc_aux,self.object.jdc_aux.nom,
-                             label_onglet=None,
-                             JDCDISPLAY=macrodisplay.MACRODISPLAY)
-
-  def makeView(self,appli,node):
-    if not hasattr(self.object,"jdc_aux") or self.object.jdc_aux is None:
-         showerror("Poursuite vide","Une POURSUITE doit etre correctement initialisée pour etre visualisée")
-         return
-    nom=self.object.nom
-    if hasattr(self.object,'fichier_ini'):
-       if self.object.fichier_ini is None:
-          nom=nom+' '+"Fichier non défini"
-       else:
-          nom=nom+' '+self.object.fichier_ini
-    macdisp=macrodisplay.makeMacroDisplay(appli,self,nom)
-
-class INCLUDE_MATERIAUTreeItem(INCLUDETreeItemBase):
-  rmenu_specs=[("View","makeView"),
-              ]
-  def iscopiable(self):
-      """
-      Retourne 1 si l'objet est copiable, 0 sinon
-      """
-      return 1
-
-
-def treeitem(appli, labeltext, object, setfunction=None):
-   """ Factory qui retourne l'item adapté 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
-    
-import macrodisplay
diff --git a/Editeur/compomclist.py b/Editeur/compomclist.py
deleted file mode 100644 (file)
index ae92e03..0000000
+++ /dev/null
@@ -1,225 +0,0 @@
-# -*- 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 types
-from Tkinter import *
-import Pmw
-
-from Noyau.N_OBJECT import ErrorObj
-import Objecttreeitem
-import panels
-import traceback
-
-class MCLISTPanel(panels.Panel):
-    def init(self):
-        test_ajout = self.node.item.ajout_possible()
-        nom_mcfact = self.node.item.get_nom()
-        if test_ajout:
-            texte = "Pour ajouter une autre occurrence du mot-clé facteur %s, cliquez ci-dessous" %nom_mcfact
-        else:
-            texte = "Vous ne pouvez pas ajouter une autre occurrence du mot-clé facteur %s ?" %nom_mcfact
-        self.label = Label(self,text = texte)
-        self.label.place(relx=0.5,rely=0.4,anchor='center')
-        if test_ajout:
-            self.but=Button(self,text="AJOUTER",command=self.ajout_occurrence)
-            self.but.place(relx=0.5,rely=0.6,anchor='center')
-            #Button(self,text="NON",command=None).place(relx=0.6,rely=0.6,anchor='center')
-
-    def ajout_occurrence(self,event=None):
-        self.node.parent.append_child(self.node.item.get_nom())
-
-import compofact
-import compoerror
-import treewidget
-
-class Node(treewidget.Node):
-    def doPaste(self,node_selected):
-        objet_a_copier = self.item.get_copie_objet()
-        child=node_selected.doPaste_MCF(objet_a_copier)
-        #print "doPaste",child
-        return child
-
-    def doPaste_MCF(self,objet_a_copier):
-        if self.item.isMCList() :
-          # le noeud courant est une MCList
-          child = self.append_child(objet_a_copier,pos='first',retour='oui')
-          #child = self.parent.append_child(objet_a_copier,pos='first',retour='oui')
-        elif self.item.isMCFact() :
-          # le noeud courant est un MCFACT
-          if self.parent.item.isMCList():
-             # le noeud selectionne est un MCFACT dans une MCList
-             child = self.parent.append_child(objet_a_copier,
-                                              pos=self.item,
-                                              retour='oui')
-          else:
-             # le noeud MCFACT selectionne n'est pas dans une MCList
-             child = self.parent.append_child(objet_a_copier,retour='oui')
-        else:
-          showinfo("Copie impossible",
-                   "Vous ne pouvez coller le mot-clé facteur copié à ce niveau de l'arborescence !")
-          self.appli.affiche_infos("Copie refusée")
-          child=None
-        #print "doPaste_MCF",child
-        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 clé 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-clé " + obj.nom + " supprimé"
-           self.appli.affiche_infos(message)
-           return 1
-        else:
-           self.appli.affiche_infos('Impossible de supprimer ce mot-clé')
-           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/Editeur/componiveau.py b/Editeur/componiveau.py
deleted file mode 100644 (file)
index 0a74d55..0000000
+++ /dev/null
@@ -1,133 +0,0 @@
-# -*- 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 Tkinter import *
-import Pmw
-
-import Objecttreeitem
-import panels
-import fontes
-from Extensions import commentaire 
-
-Fonte_Niveau = fontes.canvas_gras_italique
-Fonte_Niveau_inactif = fontes.canvas_italique
-
-class NIVEAUPanel(panels.OngletPanel):
-    def init(self):
-        """ Initialise les frame des panneaux contextuels relatifs à un JDC """
-        panneau=Pmw.PanedWidget(self,orient='horizontal')
-        panneau.add('left',min=0.4,max=0.6,size=0.5)
-        panneau.add('right',min=0.4,max=0.6,size=0.5)
-        panneau.pack(expand=1,fill='both')
-        self.bouton_com.pack_forget()
-        self.makeJDCPage(panneau.pane('left'))
-        self.enlevebind()
-
-
-import treewidget
-class Node(treewidget.Node):pass
-
-
-class NIVEAUTreeItem(Objecttreeitem.ObjectTreeItem):
-  panel = NIVEAUPanel
-  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/Editeur/componuplet.py b/Editeur/componuplet.py
deleted file mode 100644 (file)
index 5098b97..0000000
+++ /dev/null
@@ -1,175 +0,0 @@
-# -*- 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
-import Tkinter
-import Pmw
-from repr import Repr
-from copy import copy,deepcopy
-
-# Modules Eficas
-import Objecttreeitem
-import panels
-
-#
-__version__="$Name:  $"
-__Id__="$Id: componuplet.py,v 1.8 2005/11/03 09:03:48 eficas Exp $"
-#
-
-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
-
-class NUPLETPanel(panels.OngletPanel):
-  def init(self):
-      """ Initialise les frame des panneaux contextuels relatifs \340 un NUPLET """
-      self.nb=Pmw.NoteBook(self,raisecommand=self.raisecmd)
-      self.nb.pack(fill = 'both', expand = 1)
-      self.nb.add("Valeurs",tab_text="Saisir valeurs")
-      self.makeValeurPage(self.nb.page('Valeurs'))
-      self.enlevebind()
-      self.creebind()
-      self.nb.setnaturalsize()
-    
-  def makeValeurPage(self,page):
-    label = Tkinter.Label(page,text='Valeurs :').pack(side=Tkinter.LEFT)
-    i=0
-    for obj in self.node.item.object.mc_liste:
-      frame_valeur=Tkinter.Frame(page)
-      frame_valeur.pack(side=Tkinter.LEFT)
-      if hasattr(obj,'definition'):
-         objet_mc=obj.definition
-      else:  
-         objet_mc=None
-      valeur=obj.valeur
-      if type(valeur) == types.InstanceType :
-        valeur=obj.getval()
-      aide=self.gen_aide(obj)
-      if objet_mc.into != None :
-        l_choix=list(objet_mc.into)
-        #obj.set_valeur(l_choix[0],evaluation='non')
-        obj.set_valeur(l_choix[0])
-        option=Pmw.OptionMenu (frame_valeur,
-                items = l_choix,
-                menubutton_width = 10,
-                command = lambda e,obj=obj,s=self:s.record_valeur(val=e,obj=obj),
-        )
-        option.pack(side=Tkinter.LEFT,padx=1)
-      else :
-        entry = Tkinter.Entry(frame_valeur,relief='sunken',width=10)
-        entry.pack(side=Tkinter.LEFT,padx=1)
-        entry.bind("<Return>",
-                lambda e,obj=obj,s=self:s.valid_valeur(e,obj=obj))
-        entry.bind("<KP_Enter>",
-                lambda e,obj=obj,s=self:s.valid_valeur(e,obj=obj))
-        if i==0:entry.focus_set()
-        #aide = Tkinter.Label(frame_valeur, text = aide)
-        #aide.place(relx=0.5,rely=0.55,anchor='n')
-        if valeur != None :
-          entry.delete(0,Tkinter.END)
-          entry.insert(0,obj.getval())
-      i=i+1
-
-  def record_valeur(self,val=None,obj=None,mess='Valeur du mot-cl\351 enregistr\351e'):
-    """ 
-      Enregistre  val comme valeur de self.node.item.object SANS faire de 
-      test de validité
-    """
-    #obj.set_valeur(val,evaluation='non')
-    obj.set_valeur(val)
-    self.parent.appli.affiche_infos(mess)
-    #self.node.parent.verif()
-    #self.node.update()
-
-  def valid_valeur(self,e,obj=None,mess='Valeur du mot-cl\351 enregistr\351e'):
-    """ 
-      Enregistre  val comme valeur de self.node.item.object avec
-      test de validité
-    """
-    valeur=e.widget.get()
-    e.widget.delete(0,Tkinter.END)
-    anc_val=obj.getval()
-    if anc_val == None:anc_val=''
-    test=obj.set_valeur(valeur)
-    if test:
-      if obj.isvalid():
-          self.parent.appli.affiche_infos('Valeur du mot-cl\351 enregistr\351e')
-          e.widget.insert(0,obj.getval())
-      else:
-          #obj.set_valeur(anc_val,evaluation='non')
-          obj.set_valeur(anc_val)
-          self.parent.appli.affiche_infos("valeur du mot-cl\351 non autoris\351e")
-          e.widget.insert(0,anc_val)
-    else:
-      print "impossible d'\351valuer : %s " %valeur
-      print "test =",test
-      self.parent.appli.affiche_infos("valeur du mot-cl\351 non autoris\351e")
-      e.widget.delete(0,Tkinter.END)
-      e.widget.insert(0,anc_val)
-          
-    #self.node.parent.verif()
-    #self.node.update()
-
-  def gen_aide(self,obj):
-    return ""
-    
-
-class NUPLETTreeItem(Objecttreeitem.ObjectTreeItem):
-  panel=NUPLETPanel
-
-  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/Editeur/compooper.py b/Editeur/compooper.py
deleted file mode 100644 (file)
index 2fcbfff..0000000
+++ /dev/null
@@ -1,325 +0,0 @@
-# -*- 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 Tkinter import *
-import Pmw
-import traceback
-import Objecttreeitem
-import panels
-import fontes
-
-class OPERPanel(panels.OngletPanel):
-
-  def init(self):
-    nb = Pmw.NoteBook(self,raisecommand=self.raisecmd)
-    nb.pack(fill = 'both', expand = 1)
-    self.nb=nb
-    nb.add('Mocles', tab_text='Nouveau mot-clé')
-    nb.add('Concept', tab_text='Nommer concept')
-    nb.add('Commande', tab_text='Nouvelle Commande')
-    nb.add('Commentaire',tab_text='Paramètre/Commentaire')
-    panneau=Pmw.PanedWidget(nb.page("Mocles"),
-                            orient='horizontal')
-    panneau.add('left',min=0.4,max=0.60,size=0.50)
-    panneau.add('right',min=0.4,max=0.60,size=0.50)
-    panneau.pack(expand=1,fill='both')
-    panneau.setnaturalsize()
-    self.makeCommandePage(nb.page("Commande"))
-    self.makeConceptPage_oper(nb.page("Concept"))
-    self.makeMoclesPage(panneau.pane('left'))
-    self.makeReglesPage(panneau.pane('right'))
-    #self.makeCommentairePage(nb.page("Commentaire"))
-    self.makeParamCommentPage_for_etape(nb.page("Commentaire"))
-    nb.tab('Mocles').focus_set()
-    self.nb.setnaturalsize()
-    self.enlevebind()
-    self.creebind()
-    self.affiche()
-
-  def makeConceptPage_oper(self,page):
-      """ Crée la page de saisie du nom du concept """
-      if self.node.item.is_reentrant():
-          # commande obligatoirement reentrante
-          self.makeConceptPage_reentrant(page)
-      else:
-          # commande non reentrante ou facultativement reentrante
-          self.makeConceptPage(page)
-
-  def makeConceptPage_reentrant(self,page):
-      """ Crée la page de saisie du nom de concept pour un opérateur reentrant
-      cad propose dans la liste des SD utilisées dans la commande celle(s) dont le
-      type est compatible avec celui que retourne l'opérateur """
-      liste_noms_sd = self.node.item.get_noms_sd_oper_reentrant()
-      self.listbox = Pmw.ScrolledListBox(page,
-                                         items=liste_noms_sd,
-                                         labelpos='n',
-                                         label_text="Structure(s) de données à enrichir par l'opérateur courant :",
-                                         listbox_height = 6,
-                                         selectioncommand=self.select_valeur_from_list,
-                                         dblclickcommand=lambda s=self,c=self.execConcept : s.choose_valeur_from_list(c))
-      self.listbox.place(relx=0.5,rely=0.3,relheight=0.4,anchor='center')
-      Label(page,text='Structure de donnée choisie :').place(relx=0.05,rely=0.6)
-      self.valeur_choisie = StringVar()
-      self.label_valeur = Label(page,textvariable=self.valeur_choisie)
-      self.label_valeur.place(relx=0.45,rely=0.6)
-      if len(liste_noms_sd) == 1 :
-          self.valeur_choisie.set(liste_noms_sd[0])
-
-  def select_valeur_from_list(self):
-      try:
-          choix = self.listbox.getcurselection()[0]
-          self.valeur_choisie.set(choix)
-      except:
-          traceback.print_exc()
-          
-
-  def choose_valeur_from_list(self,command):
-      try:
-          choix = self.listbox.getcurselection()[0]
-          self.valeur_choisie.set(choix)
-          apply(command,(),{})
-      except:
-          traceback.print_exc()
-
-import treewidget
-class Node(treewidget.Node):
-    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.doPaste_Commande(objet_a_copier)
-        return child
-
-    def doPaste_Commande(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 doPaste_MCF(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
-
-
-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 accès aux attributs
-      Dans le cas d'une ETAPE, _object et object pointent vers le 
-      meme objet.
-  """
-  panel = OPERPanel
-  itemNode=Node
-  
-  def IsExpandable(self):
-      return 1
-
-  def GetIconName(self):
-      """
-      Retourne le nom de l'icône à 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:
-         return "ast-red-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
-      """
-      if self.object.isactif():
-        # None --> fonte et couleur par défaut
-        return self.labeltext,None,None
-      else:
-        return self.labeltext,fontes.standard_italique,None
-      
-  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):
-      #print "compooper.additem",name,pos
-      mcent = self._object.addentite(name,pos)
-      return mcent
-
-  def suppitem(self,item) :
-      # item : item du MOCLE de l'ETAPE à 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.get()
-      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.get()
-      g=generator.plugins[format]()
-      texte_commande = g.gener(self.object,format='beautifie')
-      # Il faut enlever la première 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
-
-  def visu_3D(self,appli,node) :
-      import TroisDPal
-      troisD=TroisDPal.TroisDPilote(node.item,appli,node.parent)
-      troisD.envoievisu()
-
-import Accas
-treeitem = EtapeTreeItem
-objet = Accas.ETAPE    
-
diff --git a/Editeur/compoparam.py b/Editeur/compoparam.py
deleted file mode 100644 (file)
index 98f7a7c..0000000
+++ /dev/null
@@ -1,248 +0,0 @@
-# -*- 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 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
-from Tkinter import *
-import Pmw
-import string
-
-# import modules EFICAS
-import Objecttreeitem
-import panels
-import fontes
-
-
-Fonte_PARAMETRE = fontes.standard_italique
-Fonte_TITRE = fontes.standard_gras_souligne
-
-
-class PARAMPanel(panels.OngletPanel):
-  """
-  Classe servant à construire le panneau associé à un paramètre.
-  C'est au moyen de ce panneau que l'utilisateur peut accéder
-  aux nom et valeur du paramètre en vue éventuellement de les
-  modifier.
-  """
-
-  def init(self):
-    """
-    Initialise les frame des panneaux contextuels relatifs à un PARAMETRE
-    """
-    nb = Pmw.NoteBook(self,raisecommand=self.raisecmd)
-    nb.pack(fill = 'both', expand = 1)
-    self.nb=nb
-    nb.add('Parametre', tab_text='Valeur Paramètre')
-    nb.add('Commande', tab_text='Nouvelle Commande')
-    nb.add('Commentaire',tab_text='Paramètre/Commentaire')
-    self.makeParametrePage(nb.page("Parametre"))
-    self.makeCommandePage(nb.page("Commande"))
-    self.makeParamCommentPage_for_etape(nb.page("Commentaire"))
-    nb.tab('Parametre').focus_set()
-    nb.setnaturalsize()
-    self.make_buttons()
-    self.enlevebind()
-    self.creebind()
-    
-  def makeParametrePage(self,page):
-    """
-    Crée la page qui permet d'afficher et d'éditer le texte du PARAMETRE
-    """
-    self.frame_valeur = Frame(page)
-    #self.frame_valeur.place(relwidth=0.9,relheight=0.9,relx=0.05,rely=0.05,anchor='nw')
-    self.frame_valeur.pack(expand=1)
-    # affichage du titre du panneau
-    self.titre = StringVar()
-    self.titre.set("PARAMETRE "+self.node.item.get_nom())
-    #Label(self.frame_valeur,textvariable=self.titre,font=Fonte_TITRE).place(relx=0.5,rely=0.1,anchor='n')
-    Label(self.frame_valeur,textvariable=self.titre,font=Fonte_TITRE).grid(row=0,columnspan=2,padx=5,pady=5)
-    # création des labels et entries associés aux nom et valeur du paramètre
-    #Label(self.frame_valeur,text= 'Nom du paramètre : ').place(relx=0.,rely=0.3)
-    Label(self.frame_valeur,text= 'Nom du paramètre : ').grid(row=1,sticky=W,padx=5,pady=5)
-    self.entry_nom = Entry(self.frame_valeur)
-    #Label(self.frame_valeur,text= 'Valeur du paramètre : ').place(relx=0.,rely=0.5)
-    Label(self.frame_valeur,text= 'Valeur du paramètre : ').grid(row=2,sticky=W,padx=5,pady=5)
-    self.entry_val = Entry(self.frame_valeur)
-    # binding sur entry_nom
-    self.entry_nom.bind("<Return>",lambda e,s=self : s.entry_val.focus())
-    self.entry_val.bind("<Return>",lambda e,s=self : s.change_valeur())
-    self.entry_nom.bind("<KP_Enter>",lambda e,s=self : s.entry_val.focus())
-    self.entry_val.bind("<KP_Enter>",lambda e,s=self : s.change_valeur())
-    # affichage des entries
-    #self.entry_nom.place(relx=0.35,rely=0.3,relwidth=0.3)
-    self.entry_nom.grid(row=1,column=1,sticky=W,padx=5,pady=5)
-    #self.entry_val.place(relx=0.35,rely=0.5,relwidth=0.5)
-    self.entry_val.grid(row=2,column=1,sticky=W,padx=5,pady=5)
-    # affichage d'une phrase d'aide
-    aide = """
-    Un retour de chariot dans une zone de saisie vous permet de vérifier si
-    la valeur que vous avez entrée est valide.
-    Ce n'est qu'après avoir appuyé sur le bouton Valider que les nouvelles
-    valeurs seront effectivement prises en compte
-    """
-    #Label(self.frame_valeur,text=aide).place(relx=0.5,rely=0.65,anchor='n')
-    Label(self.frame_valeur,text=aide).grid(row=3,columnspan=2,padx=5,pady=5)
-    self.frame_valeur.columnconfigure(1,weight=1)
-    # affichage des nom et valeur du paramètre
-    self.display_valeur()
-    self.entry_nom.focus()
-
-  def make_buttons(self):
-    """
-    Crée les boutons du panneau
-    """
-    #self.bouton_sup.place_forget()
-    #self.bouton_doc.place_forget()
-    #self.bouton_val = Button(self.fr_but,text='Valider',command=self.change_valeur,width=14)
-    #self.bouton_ann = Button(self.fr_but,text='Annuler',command=self.display_valeur,width=14)
-    #self.bouton_val.place(relx=0.25,rely=0.5,relheight=0.8,anchor='center')
-    #self.bouton_ann.place(relx=0.50,rely=0.5,relheight=0.8,anchor='center')
-    #self.bouton_sup.place(relx=0.75,rely=0.5,relheight=0.8,anchor='center')
-
-    self.bouton_sup.pack_forget()
-    self.bouton_doc.pack_forget()
-    self.bouton_val = Button(self.fr_but,text='Valider',command=self.change_valeur)
-    self.bouton_ann = Button(self.fr_but,text='Annuler',command=self.display_valeur)
-    self.bouton_val.pack(side='left',padx=5, pady=5)
-    self.bouton_ann.pack(side='left',padx=5, pady=5)
-    self.bouton_sup.pack(side='right',padx=5, pady=5)
-
-  def change_valeur(self):
-    """
-    Stocke la nouvelle valeur donnée par l'utilisateur comme valeur du PARAMETRE
-    """
-    if self.parent.modified == 'n' : self.parent.init_modif()
-    new_nom = self.entry_nom.get()
-    new_val = self.entry_val.get()
-    self.node.item.set_nom(new_nom)
-    self.node.item.set_valeur(new_val)
-    self.node.update()
-    self.display_valeur()
-    
-  def display_valeur(self):
-    """
-    Affiche dans self.widget_text la valeur de l'objet PARAMETRE
-    (annule d'éventuelles modifications faite par l'utilisateur)
-    """
-    self.entry_nom.delete(0,END)
-    self.entry_val.delete(0,END)
-    self.titre.set('PARAMETRE '+self.node.item.get_nom())
-    self.entry_nom.insert(END,self.node.item.get_nom())
-    self.entry_val.insert(END,self.node.item.get_valeur())
-
-class PARAMTreeItem(Objecttreeitem.ObjectTreeItem):
-    """
-    Classe servant à définir l'item porté par le noeud de l'arbre d'EFICAS
-    qui représente le PARAMETRE
-    """
-    panel = PARAMPanel
-
-    def init(self):
-      self.setfunction = self.set_valeur
-
-# ---------------------------------------------------------------------------
-#                   API du PARAMETRE pour l'arbre 
-# ---------------------------------------------------------------------------
-
-    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 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 'Paramètre',Fonte_PARAMETRE,None
-
-    def GetText(self):
-      """
-      Retourne le texte à afficher après le nom de la commande (ici après 'paramètre')
-      Ce texte est tronqué à 25 caractères
-      """
-      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 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/Editeur/compoparameval.py b/Editeur/compoparameval.py
deleted file mode 100644 (file)
index 41c6e29..0000000
+++ /dev/null
@@ -1,311 +0,0 @@
-# -*- 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 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
-from Tkinter import *
-import Pmw
-import string
-
-# import modules EFICAS
-import widgets
-import Objecttreeitem
-import panels
-import fontes
-
-
-Fonte_PARAMETRE = fontes.standard_italique
-Fonte_TITRE = fontes.standard_gras_souligne
-
-
-class PARAM_EVALPanel(panels.OngletPanel):
-  """
-  Classe servant à construire le panneau associé à un paramètre.
-  C'est au moyen de ce panneau que l'utilisateur peut accéder
-  aux nom et valeur du paramètre en vue éventuellement de les
-  modifier.
-  """
-
-  def init(self):
-    """
-    Initialise les frame des panneaux contextuels relatifs à un PARAMETRE
-    """
-    nb = Pmw.NoteBook(self,raisecommand=self.raisecmd)
-    nb.pack(fill = 'both', expand = 1)
-    self.nb=nb
-    nb.add('Parametre', tab_text='Paramètre EVAL')
-    nb.add('Commande', tab_text='Nouvelle Commande')
-    nb.add('Commentaire',tab_text='Paramètre/Commentaire')
-    self.makeParametrePage(nb.page("Parametre"))
-    self.makeCommandePage(nb.page("Commande"))
-    self.makeParamCommentPage_for_etape(nb.page("Commentaire"))
-    nb.tab('Parametre').focus_set()
-    nb.setnaturalsize()
-    self.make_buttons()
-    
-  def makeParametrePage(self,page):
-    """
-    Crée la page qui permet d'afficher et d'éditer le texte du PARAMETRE
-    """
-    self.frame_valeur = Frame(page)
-    self.frame_valeur.place(relwidth=0.9,relheight=0.9,relx=0.05,rely=0.05,anchor='nw')
-    # affichage du titre du panneau
-    self.titre = StringVar()
-    self.titre.set("PARAMETRE EVAL "+self.node.item.get_nom())
-    Label(self.frame_valeur,textvariable=self.titre,font=Fonte_TITRE).place(relx=0.5,rely=0.1,anchor='n')
-    # création des labels et entries associés aux nom et valeur du paramètre
-    Label(self.frame_valeur,text= 'Nom du paramètre : ').place(relx=0.,rely=0.3)
-    self.entry_nom = Entry(self.frame_valeur)
-    Label(self.frame_valeur,text= 'Valeur du paramètre : ').place(relx=0.,rely=0.5)
-    self.entry_val = Entry(self.frame_valeur)
-    # binding sur entry_nom
-    self.entry_nom.bind("<Return>",lambda e,s=self : s.verif_nom())
-    self.entry_val.bind("<Return>",lambda e,s=self : s.verif_eval())
-    self.entry_nom.bind("<KP_Enter>",lambda e,s=self : s.verif_nom())
-    self.entry_val.bind("<KP_Enter>",lambda e,s=self : s.verif_eval())
-    # affichage des entries
-    self.entry_nom.place(relx=0.35,rely=0.3,relwidth=0.3)
-    self.entry_val.place(relx=0.35,rely=0.5,relwidth=0.5)
-    # affichage d'une phrase d'aide
-    aide = """
-    Un retour de chariot dans une zone de saisie vous permet de vérifier si
-    la valeur que vous avez entrée est valide.
-    Ce n'est qu'après avoir appuyé sur le bouton Valider que les nouvelles
-    valeurs seront effectivement prises en compte
-    """
-    Label(self.frame_valeur,text=aide).place(relx=0.5,rely=0.65,anchor='n')
-    # affichage des nom et valeur du paramètre
-    self.display_valeur()
-    self.entry_nom.focus()
-
-  def make_buttons(self):
-    """
-    Crée les boutons du panneau
-    """
-    #self.bouton_sup.place_forget()
-    #self.bouton_doc.place_forget()
-    self.bouton_sup.pack_forget()
-    self.bouton_doc.pack_forget()
-    #self.bouton_val = Button(self.fr_but,text='Valider',command=self.change_valeur,width=14)
-    #self.bouton_ann = Button(self.fr_but,text='Annuler',command=self.display_valeur,width=14)
-    self.bouton_val = Button(self.fr_but,text='Valider',command=self.change_valeur)
-    self.bouton_ann = Button(self.fr_but,text='Annuler',command=self.display_valeur)
-    self.bouton_val.bind("<Return>",lambda e,s=self : s.bouton_val.invoke())
-    self.bouton_val.bind("<KP_Enter>",lambda e,s=self : s.bouton_val.invoke())
-    #self.bouton_val.place(relx=0.25,rely=0.5,relheight=0.8,anchor='center')
-    #self.bouton_ann.place(relx=0.50,rely=0.5,relheight=0.8,anchor='center')
-    #self.bouton_sup.place(relx=0.75,rely=0.5,relheight=0.8,anchor='center')
-    self.bouton_val.pack(side='left',padx=5, pady=5)
-    self.bouton_ann.pack(side='left',padx=5, pady=5)
-    self.bouton_sup.pack(side='left',padx=5, pady=5)
-
-  def change_valeur(self):
-    """
-    Stocke la nouvelle valeur donnée par l'utilisateur comme valeur du PARAMETRE
-    """
-    if self.parent.modified == 'n' : self.parent.init_modif()
-    new_nom = self.entry_nom.get()
-    new_val = self.entry_val.get()
-    #self.node.item.set_nom(new_nom)
-    #self.node.item.set_valeur(new_val)
-    #self.node.update()
-    #self.display_valeur()
-    # on essaie de stocker les noms et valeurs
-    test,erreur = self.node.item.save_parametre_eval(new_nom,new_val)
-    if test :
-        # on a pu stocker les nouveaux paramètres : il faut rafraîchir l'affichage
-        self.node.update()
-        self.display_valeur()
-        self.parent.appli.affiche_infos("Expression EVAL %s modifiée" %self.node.item.get_nom())
-    else:
-        # la formule est incorrecte : on affiche les erreurs
-        widgets.showerror("Expression EVAL incorrecte",erreur)
-        self.parent.appli.affiche_infos("Expression EVAL %s non modifiée" %self.node.item.get_nom())
-    
-  def display_valeur(self):
-    """
-    Affiche dans self.widget_text la valeur de l'objet PARAMETRE
-    (annule d'éventuelles modifications faite par l'utilisateur)
-    """
-    self.entry_nom.delete(0,END)
-    self.entry_val.delete(0,END)
-    self.titre.set('PARAMETRE '+self.node.item.get_nom())
-    self.entry_nom.insert(END,self.node.item.get_nom())
-    self.entry_val.insert(END,self.node.item.get_valeur())
-
-  def verif_nom(self):
-    """
-    Lance la vérification du nom donné par l'utilisateur dans entry_nom
-    """
-    nom = self.entry_nom.get()
-    test,erreur = self.node.item.verif_nom(nom)
-    if not test :
-        widgets.showerror("Nom invalide",erreur)
-        self.entry_nom.focus()
-        self.entry_nom.selection_range(0,END)
-        self.parent.appli.affiche_infos("Nom du paramètre refusé")
-    else:
-        self.parent.appli.affiche_infos("Nom du paramètre accepté")
-        
-  def verif_eval(self,event=None):
-    """
-    Lance la vérification de l'expression EVAL présente dans entry_val
-    """
-    exp_eval = self.entry_val.get()
-    test,erreur = self.node.item.verif_eval(exp_eval)
-    if not test:
-        widgets.showerror("Expression EVAL invalide",erreur)
-        self.entry_val.focus()
-        self.entry_val.selection_range(0,END)
-        self.parent.appli.affiche_infos("Expression EVAL refusée")
-    else:
-        self.parent.appli.affiche_infos("Expression EVAL acceptée")
-
-class PARAM_EVALTreeItem(Objecttreeitem.ObjectTreeItem):
-    """
-    Classe servant à définir l'item porté par le noeud de l'arbre d'EFICAS
-    qui représente le PARAMETRE
-    """
-    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'icône 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 'EVAL',Fonte_PARAMETRE,None
-
-    def GetText(self):
-      """
-      Retourne le texte à afficher après le nom de la commande (ici après 'paramètre')
-      Ce texte est tronqué à 25 caractères
-      """
-      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 paramètre = 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 chaîne 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 paramètre
-      """
-      return self.object.get_nom()
-
-    def set_valeur(self,new_valeur):
-      """
-      Affecte new_valeur à l'objet PARAMETRE_EVAL
-      """
-      # on construit le texte de la nouvelle valeur
-      new_valeur = 'EVAL("""'+new_valeur+'""")'
-      # on affecte la nouvelle valeur à self.object
-      self.object.set_valeur(new_valeur)
-
-    def set_nom(self,new_nom):
-      """
-      Renomme le paramètre
-      """
-      self.object.set_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 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 paramètres comme nouveaux paramètres de l'EVAL courant et retourne 1
-          - si non, laisse les paramètres 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 paramètres
-          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/Editeur/compoproc.py b/Editeur/compoproc.py
deleted file mode 100644 (file)
index cb24795..0000000
+++ /dev/null
@@ -1,57 +0,0 @@
-# -*- 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 Tkinter import *
-import Pmw
-
-import Objecttreeitem
-import panels
-import fontes
-import compooper
-
-class PROCPanel(panels.OngletPanel):
-  def init(self):
-    nb = Pmw.NoteBook(self,raisecommand=self.raisecmd)
-    self.nb=nb
-    nb.pack(fill = 'both', expand = 1)
-    nb.add('Mocles', tab_text='Ajouter mots-clés')
-    nb.add('Commande', tab_text='Nouvelle Commande')
-    nb.add('Commentaire',tab_text='Paramètre/Commentaire')
-    panneau=Pmw.PanedWidget(nb.page("Mocles"),
-                            orient='horizontal')
-    panneau.add('left',min=0.4,max=0.6,size=0.5)
-    panneau.add('right',min=0.4,max=0.6,size=0.5)
-    panneau.pack(expand=1,fill='both')
-    self.makeCommandePage(nb.page("Commande"))
-    self.makeMoclesPage(panneau.pane('left'))
-    self.makeReglesPage(panneau.pane('right'))
-    self.makeParamCommentPage_for_etape(nb.page("Commentaire"))
-    nb.setnaturalsize()
-    self.enlevebind()
-    self.creebind()
-    self.affiche()
-
-class ProcEtapeTreeItem(compooper.EtapeTreeItem):
-  panel = PROCPanel
-  
-import Accas
-treeitem = ProcEtapeTreeItem
-objet = Accas.PROC_ETAPE    
-
diff --git a/Editeur/composimp.py b/Editeur/composimp.py
deleted file mode 100644 (file)
index 7be5ba4..0000000
+++ /dev/null
@@ -1,652 +0,0 @@
-# -*- 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 Tkinter import *
-import Pmw
-from copy import copy,deepcopy
-import traceback
-
-# Modules Eficas
-import Objecttreeitem
-import prefs
-import panels
-import images
-from widgets import ListeChoix
-from widgets import FenetreDeSelection
-
-from Noyau.N_CR import justify_text
-from utils import substract_list
-
-      
-class SIMPTreeItem(Objecttreeitem.AtomicObjectTreeItem):
-  from newsimppanel import newSIMPPanel
-  panel = newSIMPPanel
-
-  def init(self) :
-      self.expandable = 0
-      self.affect_panel()
-
-
-  def affect_panel(self):
-      """
-      Cette méthode attribue le panel à l'objet pointé par self en fonction de la
-      nature de la valeur demandée pour cet objet
-      """
-      from uniquepanel import UNIQUE_Panel
-      from plusieurspanel import PLUSIEURS_Panel
-
-      #print "affect_panel : ",self.nom,self.is_list(),self.has_into()
-      # Attention l ordre des if est important
-
-      if self.wait_shell():
-          # l'objet attend un shell
-          from shellpanel import SHELLPanel
-          self.panel = SHELLPanel
-      elif self.has_into():
-          # l'objet prend sa (ses) valeur(s) dans un ensemble discret de valeurs
-          if self.is_list() :
-             from plusieursintopanel import PLUSIEURS_INTO_Panel
-             self.panel = PLUSIEURS_INTO_Panel
-          else:
-             from uniqueintopanel import UNIQUE_INTO_Panel
-             self.panel = UNIQUE_INTO_Panel
-      else:
-          # l'objet prend une ou des valeurs à priori quelconques
-          if self.is_list() :
-              # on attend une liste de valeurs mais de quel type ?
-              if self.wait_assd():
-                  # on attend une liste de SD
-                  from plusieursassdpanel import PLUSIEURS_ASSD_Panel
-                  self.panel = PLUSIEURS_ASSD_Panel
-              else:
-                  # on attend une liste de valeurs de types debase (entiers, réels,...)
-                  #from plusieursbasepanel import PLUSIEURS_BASE_OR_UNELISTE_Panel
-                  #self.panel = PLUSIEURS_BASE_OR_UNELISTE_Panel
-                  from plusieursbasepanel import PLUSIEURS_BASE_Panel
-                  self.panel = PLUSIEURS_BASE_Panel
-          else:
-              # on n'attend qu'une seule valeur mais de quel type ?
-              if self.wait_co():
-                  # on attend une SD ou un objet de la classe CO (qui n'existe pas encore)
-                  from uniquesdcopanel import UNIQUE_SDCO_Panel
-                  self.panel = UNIQUE_SDCO_Panel
-              elif self.wait_assd():
-                  # on attend une SD
-                  from uniqueassdpanel import UNIQUE_ASSD_Panel
-                  from uniqueassdpanel import UNIQUE_ASSD_Panel_Reel
-                  if 'R' in self.GetType():
-                     self.panel = UNIQUE_ASSD_Panel_Reel
-                  else :
-                     self.panel = UNIQUE_ASSD_Panel
-              else:
-                  # on attend une valeur d'un type de base (entier,réel,...)
-                  if self.wait_complex():
-                      # on attend un complexe
-                      from uniquecomppanel import UNIQUE_COMP_Panel
-                      self.panel = UNIQUE_COMP_Panel
-                  else:
-                      # on attend un entier, un réel ou une string
-                      from uniquebasepanel import UNIQUE_BASE_Panel
-                      self.panel = UNIQUE_BASE_Panel
-      # cas particulier des fonctions
-      genea = self.get_genealogie()
-      if "VALE" in genea or "VALE_C" in genea:
-         if "DEFI_FONCTION" in genea :
-            from fonctionpanel import FONCTION_Panel
-            self.panel=FONCTION_Panel
-      #---------------------------------------------------------
-      # PN ajout pour lancement de Salome
-      #---------------------------------------------------------
-      if hasattr( self.appli, 'salome' ):
-          import panelsSalome
-
-          self.select_noeud_maille=0
-          self.clef_fonction="SALOME"
-          for i in range(0,len( genea )) :
-             self.clef_fonction=self.clef_fonction+"_"+ genea[i]
-             #if genea[i] == "GROUP_NO" or genea[i] == "GROUP_MA":
-          if "GROUP_NO" in genea[len(genea)-1] or "GROUP_MA" in genea[len(genea)-1]:
-             self.select_noeud_maille=1
-
-          recherche=panelsSalome.dict_classes_salome[self.panel]
-          if hasattr(recherche,self.clef_fonction):
-             self.panel=recherche
-          if self.select_noeud_maille==1 :
-             self.panel=recherche
-
-
-  #-----------------------------------------------
-  #
-  # 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éjà
-  #        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 wait_into(self):
-#      """ Méthode booléenne qui retourne 1 si l'objet pointé par self
-#      prend ses valeurs dans un ensemble discret (into), 0 sinon """
-#      if self.object.definition.into != None :
-#          return 1
-#      else:
-#          return 0
-
-  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 à 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=[]
-      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))
-      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 ...
-  #
-  #---------------------------------------------------
-  # SetText         a priori inutilisee --> commentee
-  # GetIconName
-  # GetText
-  # getval     a  priori inutilisee --> commentee
-  # set_valeur_co
-  # get_sd_avant_du_bon_type
-  # verif        a  priori inutilisee --> commentee
-  # delete_valeur_co
-
-  #def SetText(self, text):
-  #  try:
-  #    value = eval(text)
-  #    self.object.setval(value)
-  #  except:
-  #    pass
-
-  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 à afficher dans l'arbre représentant la valeur de l'objet
-    pointé par self 
-    """
-    text= self.object.GetText()
-    return text
-    
-  #def getval(self):
-  #    return self.object.getval()
-
-  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 verif(self):
-  #    pass
-
-  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' (chaîne de caractères) comme valeur de self :
-             - retourne l'objet associé si on a pu interpréter (entier, réel, ASSD,...)
-             - retourne 'valeur' (chaîne de caractères) sinon
-      """
-      newvaleur=self.eval_val(valeur)
-      return newvaleur,1
-
-  def eval_valeur_BAK(self,valeur):
-      """ Lance l'interprétation de 'valeur' (chaîne 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' (chaîne 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 où on a évalué et où 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 chaîne pour un réel
-      ou de détecter si on fait référence à 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 à 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
-
index 91697925cb9111a7646f643c1fb95476ef81653b..cca885692b204dfe41b4a7ae2db288664675b959 100644 (file)
@@ -26,8 +26,7 @@ import os,sys,string,types
 import traceback
 
 # Modules Eficas
-from widgets import showinfo,showerror,askretrycancel
-import utils
+from Editeur import utils
 
 class CONFIGbase:
 
@@ -60,8 +59,9 @@ class CONFIGbase:
   # Verifie l'existence du fichier "standard"
   # appelle la lecture de ce fichier
       if not os.path.isfile(self.fic_ini):
-          print self.fic_ini
-          showerror("Erreur","Pas de fichier de configuration" + self.fic_ini+"\n")
+          if self.appli.ihm=="TK" :
+              from widgets import showerror
+              showerror("Erreur","Pas de fichier de configuration" + self.fic_ini+"\n")
           print "Erreur à la lecture du fichier de configuration : %s" % self.fic_ini
           sys.exit(0)
       self.lecture_fichier(self.fic_ini)
@@ -73,13 +73,15 @@ class CONFIGbase:
   # les transforme en attribut de l 'objet  
   # utilisation du dictionnaire local pour récuperer style
       txt = utils.read_file(fic)
-      from styles import style
+      from InterfaceTK.styles import style
       d=locals()
       try:
          exec txt in d
       except:
          l=traceback.format_exception(sys.exc_info()[0],sys.exc_info()[1],sys.exc_info()[2])
-         showerror("Erreur","Une erreur s'est produite lors de la lecture du fichier : " + fic + "\n")
+         if self.appli.ihm=="TK" :
+              from widgets import showerror
+              showerror("Erreur","Une erreur s'est produite lors de la lecture du fichier : " + fic + "\n")
          print "Erreur à la lecture du fichier de configuration : %s" % fic
          sys.exit()
 
@@ -176,7 +178,10 @@ class CONFIGbase:
                                   mode='query')
       if not result.resultat :
           if mode == 'considerer_annuler':
-             test = askretrycancel("Erreur","Données incorrectes !")
+             test=0
+             if self.appli.ihm=="TK" :
+                from widgets import showerror,askretrycancel
+                test = askretrycancel("Erreur","Données incorrectes !")
              if not test:
                  # XXX On sort d'EFICAS, je suppose
                  self.appli.exitEFICAS()
@@ -260,7 +265,6 @@ class CONFIGStyle(CONFIGbase):
       self.titre = "Paramètres d affichage"
       self.texte_ini = "Voici les paramètres configurables :  "
       self.commande = self.creation_fichier_ini_si_possible
-      self.pref="style."
       self.labels={"background":"couleur du fonds", 
                    "foreground":"couleur de la police standard" ,
                    "standard":" police et taille standard",
diff --git a/Editeur/definition_cata.py b/Editeur/definition_cata.py
deleted file mode 100644 (file)
index 156ea48..0000000
+++ /dev/null
@@ -1,462 +0,0 @@
-# -*- 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
-
-# Modules Eficas
-import Accas
-from Noyau.N_CR import CR
-
-class CATALOGUE:
-    def __init__(self,modules_cata):
-        self.modules_cata = modules_cata # tuple de modules...
-        self.cr = CR()
-        self.state='undetermined'
-        self.entites_attributs = {}
-        self.entites_fils = []
-        self.build_entites_attributs()
-        self.build_entites_fils()
-
-    def build_entites_attributs(self):
-        pass
-        
-    def build_entites_fils(self):
-        niv_types = Accas.NIVEAU(nom="types",label="Liste des types")
-        niv_commandes = Accas.NIVEAU(nom="commandes",label="Liste des commandes")
-        self.entites_fils.append(make_commande_cata(niv_types,self))
-        self.entites_fils.append(make_commande_cata(niv_commandes,self))
-        for module_cata in self.modules_cata:
-            for e in dir(module_cata):
-                obj = getattr(module_cata,e)
-                if isCMD(obj):
-                    self.entites_fils[1].register(make_commande_cata(obj,self.entites_fils[1]))
-                elif type(obj) == types.ClassType:
-                    if issubclass(obj,Accas.ASSD):
-                        self.entites_fils[0].register(TYPE_CATA(obj))
-
-    def init_modif(self):
-        self.state = 'modified'
-        
-    def report(self):
-      """ Classe CATALOGUE
-          Methode pour generation d un rapport de validite
-      """
-      self.cr.purge()
-      self.cr.debut="DEBUT CR validation : " 
-      self.cr.fin="FIN CR validation :"
-      self.state = 'modified'
-      self.isvalid(cr='oui')
-      for fils in self.entites_fils[1].entites :
-        self.cr.add(fils.report())
-      return self.cr
-
-    def isvalid(self,cr='non'):
-        if self.state != 'unchanged':
-            valid=1
-            for fils in self.entites_fils[1].entites_fils:
-                if not fils.isvalid():
-                    valid=0
-                    break
-            self.valid = valid
-            self.state='unchanged'
-        return self.valid
-    
-def make_commande_cata(objet,pere):
-    if isinstance(objet,Accas.OPER):
-        return OPER_CATA(objet,pere,objet.nom)
-    elif isinstance(objet,Accas.PROC):
-        return PROC_CATA(objet,pere,objet.nom)
-    elif isinstance(objet,Accas.MACRO):
-        return MACRO_CATA(objet,pere,objet.nom)
-    elif isinstance(objet,Accas.FORM):
-        return MACRO_CATA(objet,pere,objet.nom)
-    elif isinstance(objet,Accas.NIVEAU):
-        return NIVEAU_CATA(objet,pere,objet.nom)
-    else:
-        print "Erreur dans make_commande_cata : on cherche à évaluer un objet non référencé ",objet
-
-def make_mc_cata(objet,pere,nom=''):
-    if isinstance(objet,Accas.BLOC):
-        return BLOC_CATA(objet,pere,nom)
-    elif isinstance(objet,Accas.FACT):
-        return FACT_CATA(objet,pere,nom)
-    elif isinstance(objet,Accas.SIMP):
-        return SIMP_CATA(objet,pere,nom)
-    else:
-        print "Erreur dans make_mc_cata : on cherche à évaluer un objet non référencé ",objet
-
-class TYPE_CATA:
-    def __init__(self,objet):
-        self.objet = objet
-        self.nom = objet.__name__
-
-    def isvalid(self,cr='non'):
-        return 1
-
-    def get_valeur_attribut(self,nom_attr):
-        if nom_attr == 'nom':return self.nom
-        return None
-   
-class OBJET_CATA:
-    attributs=[]
-    attributs_defauts={}
-    def __init__(self,objet,pere,nom):
-        self.objet = objet
-        self.nom = nom
-        self.pere = pere
-        self.cr = CR()
-        self.state='undetermined'
-        self.entites_fils = []
-        self.entites_attributs = {}
-        self.build_entites_attributs()
-        self.build_entites_fils()
-
-    def __str__(self):
-        s=''
-        s=self.__class__.__name__+' : '+self.nom
-        return s
-    
-    def build_entites_attributs(self):        
-        for attribut in self.attributs:
-            if hasattr(self.objet,attribut):
-                self.entites_attributs[attribut]=ATTR_CATA(attribut,getattr(self.objet,attribut))
-            else:
-                if self.attributs_defauts.has_key(attribut):
-                    self.entites_attributs[attribut]=ATTR_CATA(attribut,self.attributs_defauts[attribut])
-                else:
-                    self.entites_attributs[attribut]=ATTR_CATA(attribut,None)
-
-    def build_entites_fils(self):
-        for k,v in self.objet.entites.items():
-            self.entites_fils.append(make_mc_cata(v,self,nom=k))
-
-    def get_valeur_attribut(self,nom_attr):
-        if nom_attr in self.entites_attributs.keys():
-            return self.entites_attributs[nom_attr].valeur
-        elif nom_attr in self.attributs_defauts.keys():
-            return self.attributs_defauts[nom_attr]
-        elif nom_attr == 'domaine_validité':
-            if self.entites_attributs['into'].valeur != None :
-                return 'discret'
-            else:
-                return 'continu'
-
-    def isvalid(self,cr='non'):
-        if self.state =='unchanged':
-            return self.valid
-        else:
-            valid = 1
-            if hasattr(self,'valid'):
-                old_valid = self.valid
-            else:
-                old_valid = None
-            # on teste self lui-meme
-            if self.nom == '' or self.nom == None : valid=0
-            # on teste les attributs
-            for attribut in self.entites_attributs.values():
-                if not attribut.isvalid() : valid =0
-                break
-            # on teste les fils
-            for fils in self.entites_fils:
-                if not fils.isvalid(): valid = 0
-                break
-        self.valid = valid
-        self.state = 'unchanged'
-        if old_valid:
-            if old_valid != self.valid : self.init_modif_up()
-        return self.valid
-
-    def init_modif_up(self):
-        self.pere.state='modified'
-      
-    def report(self):
-        self.cr.purge()
-        self.cr.debut="Debut "+self.__class__.__name__+' : '+self.nom
-        self.cr.fin = "Fin "+self.__class__.__name__+' : '+self.nom
-        self.isvalid(cr='oui')
-        for attribut in self.entites_attributs.values():
-            self.cr.add(attribut.report())
-        for fils in self.entites_fils :
-            self.cr.add(fils.report())
-        return self.cr
-        
-    def set_valeur_attribut(self,nom_attr,valeur):
-        """
-        Affecte la valeur 'valeur' à l'attribut de nom 'nom-attr'
-        """
-        # il faudra être prudent sur les changements de nom : interdire de changer
-        # le nom d'un mot-clé qui serait utilisé dans une règle ???
-        self.entites_attributs[nom_attr].valeur = valeur
-        
-    def addentite(self,name,pos):
-        """
-        Permet d'ajouter un nouveau fils a self
-        """
-        self.init_modif()
-        if name == 'new_simp':
-            objet = Accas.SIMP(typ=('bidon',))
-        objet_cata = make_mc_cata(objet,self)
-        self.entites_fils.insert(pos,objet_cata)
-        return objet_cata
-
-    def init_modif(self):
-        self.state = 'modified'
-        if hasattr(self,'pere'):
-            self.pere.init_modif()
-
-    def verif_nom(self,cr='non'):
-        """
-        Méthode appelée par EFICAS et ACCAS
-        Booléenne : retourne 1 si l'attribut nom est valide, 0 sinon
-        """
-        if self.entites_attributs['nom'].valeur == '':
-            if cr == 'oui' : self.cr.fatal("L'objet de type %s n'est pas nommé" %self.__class__.__name__)
-            return 0
-        return 1
-    
-    def verif_defaut(self,cr='non'):
-        """
-        Méthode de vérification de validité du défaut
-        """
-        defaut = self.get_valeur_attribut('defaut')
-        if self.get_valeur_attribut('domaine_validite') == 'discret' :
-            if defaut not in self.get_valeur_attribut('into'):
-                if cr == 'oui' : self.cr.fatal("La valeur %s n'est pas autorisée" %str(defaut))
-                return 0
-            return 1
-        else:
-            if defaut == None : return 1
-            typ = self.get_valeur_attribut('type')
-            # on attend un TXM ?
-            if 'TXM' in typ :
-                if type(defaut) == types.StringType : return 1
-            val_min = self.get_valeur_attribut('val_min')
-            val_max = self.get_valeur_attribut('val_max')
-            # on attend un reel ?
-            if 'R' in typ :
-                if type(defaut) == types.StringType:
-                    try :
-                        nb = string.atof(defaut)
-                    except:
-                        nb=None
-                else:
-                    nb = defaut
-                if nb != None :
-                    test = 1
-                    if val_min != '**' : test = (nb >= val_min)
-                    if val_max != '**' : test = test*(nb <= val_max)
-                    if test : return 1
-            # on attend un entier ?
-            if 'I' in typ :
-                if type(defaut)==types.StringType:
-                    try:
-                        nb = string.atoi(defaut)
-                    except:
-                        pass
-                else:
-                    nb = defaut
-                if nb != None :
-                    test = 1
-                    if val_min != '**' : test = (nb >= val_min)
-                    if val_max != '**' : test = test*(nb <= val_max)
-                    if test : return 1
-            # si on passe par là, c'est que l'on n'a pas su évaluer defaut
-            if cr == 'oui' : self.cr.fatal("La valeur %s n'est pas une valeur permise" %str(defaut))
-            return 0
-
-    def verif_val_min(self,cr='non'):
-        """
-        Méthode de vérification de val_min.
-        Booléenne : retourne 1 si val_min est valide, 0 sinon
-        """
-        val_min = self.get_valeur_attribut('val_min')
-        if not val_min :
-            if cr == 'oui' : self.cr.fatal('val_min ne peut valoir None')
-            return 0
-        if val_min == '**': return 1
-        # val_min doit à ce stade être :
-        # - soit un entier ou un réel
-        # - soit une chaîne de caractères représentant un entier ou un réel (provient d'EFICAS)
-        if type(val_min) == types.StringType :
-            try :
-                val_min = string.atoi(val_min)
-            except:
-                try:
-                    val_min = string.atof(val_min)
-                except:
-                    if cr == 'oui' : self.cr.fatal("%s n'est ni un entier ni un réel" %str(val_min))
-                    return 0
-        # A ce stade, val_min doit être un entier ou un réel : on vérifie ...
-        if type(val_min) not in (types.IntType,types.FloatType) :
-            if cr == 'oui' : self.cr.fatal("%s n'est pas d'un type autorisé" %str(val_min))
-            return 0
-        # A ce stade valeur est un entier ou un réel : on peut comparer à val_max
-        val_max = self.get_valeur_attribut('val_max')
-        if val_max == '**' or val_min < val_max : return 1
-        # erreur : val_min est supérieur à val_max !!!
-        if cr == 'oui' : self.cr.fatal("%s n'est pas inférieur à %s" %(str(val_min),str(val_max)))
-        return 0
-
-    def verif_val_max(self,cr='non'):
-        """
-        Méthode de vérification de val_max.
-        Booléenne : retourne 1 si val_max est valide, 0 sinon
-        """
-        val_max = self.get_valeur_attribut('val_max')
-        if not val_max :
-            if cr == 'oui' : self.cr.fatal('val_max ne peut valoir None')
-            return 0
-        if val_max == '**': return 1
-        # val_max doit à ce stade être :
-        # - soit un entier ou un réel
-        # - soit une chaîne de caractères représentant un entier ou un réel (provient d'EFICAS)
-        if type(val_max) == types.StringType :
-            try :
-                val_max = string.atoi(val_max)
-            except:
-                try:
-                    val_max = string.atof(val_max)
-                except:
-                    if cr == 'oui' : self.cr.fatal("%s n'est ni un entier ni un réel" %str(val_max))
-                    return 0
-        # A ce stade, val_max doit être un entier ou un réel : on vérifie ...
-        if type(val_max) not in (types.IntType,types.FloatType) :
-            if cr == 'oui' : self.cr.fatal("%s n'est pas d'un type autorisé" %str(val_max))
-            return 0
-        # A ce stade valeur est un entier ou un réel : on peut comparer à val_max
-        val_min = self.get_valeur_attribut('val_min')
-        if val_min == '**' or val_min < val_max : return 1
-        # erreur : val_min est supérieur à val_max !!!
-        if cr == 'oui' : self.cr.fatal("%s n'est pas supérieur à %s" %(str(val_max),str(val_min)))
-        return 0
-    
-class OPER_CATA(OBJET_CATA):
-    attributs = ['ang','docu','fr','niveau','nom','op','op_init','reentrant','regles','repetable','sd_prod']
-  
-class PROC_CATA(OBJET_CATA):
-    attributs = ['ang','docu','fr','niveau','nom','op','op_init','regles','repetable']
-
-class MACRO_CATA(OBJET_CATA):
-    attributs = ['ang','docu','fr','niveau','nom','op','op_init','reentrant','regles','repetable','sd_prod']
-    
-class BLOC_CATA(OBJET_CATA):
-    attributs = ['ang','condition','docu','fr','nom','regles']
-
-class FACT_CATA(OBJET_CATA):
-    attributs=['ang','defaut','docu','fr','max','min','nom','regles','statut']
-
-class SIMP_CATA(OBJET_CATA):
-    attributs=['ang','defaut','docu','fr','homo','into','max','min','nom','position','statut','type','val_min','val_max']
-    attributs_defauts={'ang':'','defaut':None,'fr':'','homo':1,'into':None,'max':1,'min':1,'nom' : '','position':'local',
-                       'regles':None,'statut':'f','type':None,'val_min':'**','val_max':'**','docu':''}
-                
-    def build_entites_fils(self):
-        pass
-
-    def isvalid(self,cr='non'):
-        """
-        Mde appelpar l'externe (EFICAS et ACCAS).
-        Boolne : retourne 1 si l'objet est valide, 0 sinon
-        """
-        if self.state == 'unchanged':
-            return self.valid
-        else:
-            valid = 1
-            valid = valid*self.verif_nom(cr=cr)
-            valid = valid*self.verif_defaut(cr=cr)
-            valid = valid*self.verif_val_min(cr=cr)*self.verif_val_max(cr=cr)
-            if hasattr(self,'valid'):
-                old_valid = self.valid
-            else:
-                old_valid = None
-            self.valid = valid
-            self.state='unchanged'
-            if old_valid :
-                if old_valid != self.valid : self.init_modif_up()
-            return self.valid
-
-class NIVEAU_CATA(OBJET_CATA):
-  def __init__(self,objet,pere,nom):
-    self.pere = pere
-    self.nom = nom
-    self.state = 'undetermined'
-    self.cr = CR()
-    self.objet = objet
-    self.entites_fils=[]
-    self.entites_attributs = {}
-
-  def register(self,fils):
-    """ 
-        Enregistre la commande 굡pe :
-         - si editmode = 0 : on est en mode relecture d'un fichier de commandes
-         auquel cas on ajoute etape ࡬a fin de la liste self.etapes
-         - si editmode = 1 : on est en mode ajout d'굡pe depuis eficas auquel cas
-         cette mode ne fait rien, c'est addentité enregistre etape à¡¬a bonne place
-         dans self.etapes 
-    """
-    self.entites_fils.append(fils)
-
-  def unregister(self,etape):
-    self.entites_fils.remove(etape)
-
-  def isvalid(self,cr='non'):
-    """ Mode boolne qui retourne 0 si le niveau est invalide, 1 sinon """
-    if self.state == 'unchanged':
-        return self.valid
-    else:
-        valid = 1
-        if len(self.entites_fils) == 0:
-            #valid = self.Accas.valide_vide
-            valid = 1
-        else:
-            for commande in self.entites_fils :
-                if hasattr(commande,'isvalid'):
-                    if not commande.isvalid() :
-                        valid = 0
-                        break
-                else:
-                    print str(commande)," n'a pas de methode isvalid"
-        if hasattr(self,'valid'):
-            old_valid = self.valid
-        else:
-            old_valid = None
-        self.valid = valid
-        self.state='unchanged'
-        if old_valid:
-            if old_valid != self.valid : self.init_modif_up()
-        return self.valid
-            
-
-class ATTR_CATA(OBJET_CATA):
-    def __init__(self,nom,valeur=None):
-        self.nom = nom
-        self.valeur = valeur
-        self.cr = CR()
-        self.state='undetermined'
-        self.entites_attributs={}
-        self.entites_fils=()
-
-    def isvalid(self,cr='non'):
-        return 1
-
-def isCMD(cmd):
-   return isinstance(cmd,Accas.OPER) or isinstance(cmd,Accas.PROC) or isinstance(cmd,Accas.MACRO) or isinstance(cmd,Accas.FORM)
-
diff --git a/Editeur/eficas.py b/Editeur/eficas.py
deleted file mode 100644 (file)
index caf47fb..0000000
+++ /dev/null
@@ -1,143 +0,0 @@
-# -*- 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 contient la classe EFICAS qui est l'application
-    proprement dite. Elle est dérivée de la classe APPLI
-"""
-# Modules Python
-import string
-from Tkinter import Label
-import Pmw
-import traceback
-
-# Modules Eficas
-from widgets import showerror
-from widgets import askopenfilename
-import patches
-import appli
-from widgets import Fenetre
-
-class EFICAS(appli.APPLI):
-
-  try:
-     from prefs import appli_composants
-  except:
-     appli_composants=['readercata','bureau','browser','options']
-
-  def get_texte_infos(self):
-     texte=appli.APPLI.get_texte_infos(self)
-     texte = texte + 'Catalogue utilisé : %s\n' %  self.bureau.fic_cata
-     return texte
-
-  def exitEFICAS(self):
-     self.bureau.exitEFICAS()
-
-  def getBureau(self):
-      return self.bureau
-      
-  def browse(self,result):
-      if result == 'Browse':
-        self.ulfile = askopenfilename(parent=self.dialog.component('hull'),title="Choix fichier :")
-        self._ulfile.setentry(self.ulfile)
-      elif result == 'OK':
-        self.ulfile = self._ulfile.get()
-        # On utilise le convertisseur défini par format_fichier
-        source=self.get_source(self.ulfile)
-        if source:
-           # On a réussi à convertir le fichier self.ulfile
-           self.dialog.deactivate(result)
-           self.text=source
-        else:
-           # Une erreur a été rencontrée
-           self.text=''
-      elif result == 'Cancel':
-        self._ulfile.setentry('')
-        self.dialog.deactivate(result)
-        self.ulfile = None
-        self.text=""
-
-  def get_file(self,unite=None,fic_origine = ''):
-      """ 
-          Retourne le nom du fichier correspondant a l unite logique unite (entier)
-      """
-      if unite :
-          titre = "Choix unite %d " %unite
-      else:
-          titre = "Choix d'un fichier de poursuite"
-      self.dialog=Pmw.Dialog(self.top,
-                             title = titre,
-                             buttons = ('OK', 'Browse','Cancel'),
-                             defaultbutton='OK',
-                             command=self.browse,
-                             )
-      self.dialog.withdraw()
-      if 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
-      else:
-          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'
-      if self.test == 1: raise Exception("Erreur: "+texte)
-      w = Label(self.dialog.interior(),
-                text = texte)
-      w.pack(padx = 10, pady = 10)
-      if unite != None :
-          labeltexte = 'Fichier pour unite %d :' % unite
-      else:
-          labeltexte = 'Fichier à poursuivre :'
-      self._ulfile=Pmw.EntryField(self.dialog.interior(),
-                                  labelpos = 'w',
-                                  label_text = labeltexte,
-                                  )
-      self._ulfile.pack(fill='x', expand=1, padx=10, pady=5)
-      self._ulfile.component('entry').focus_set()
-      self.dialog.activate(geometry='centerscreenalways')
-      return self.ulfile,self.text
-
-  def get_source(self,file):
-      import convert
-      format=self.format_fichier.get()
-      # 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 à la conversion")
-            Fenetre(self,
-                    titre="compte-rendu d'erreurs, EFICAS ne sait pas convertir ce fichier",
-                    texte = str(p.cr)).wait()
-            return text
-         return text
-      else:
-         # Il n'existe pas c'est une erreur
-         self.affiche_infos("Type de fichier non reconnu")
-         showerror("Type de fichier non reconnu","EFICAS ne sait pas ouvrir ce type de fichier")
-         return None
-
-  def affiche_texte(self,entete,texte):
-      """Cette methode ouvre une fenetre modale dans laquelle on affiche un texte
-      """
-      self.affiche_infos(entete)
-      f=Fenetre(self, titre=entete, texte = texte)
-      f.wait()
-
diff --git a/Editeur/eficas_go.py b/Editeur/eficas_go.py
deleted file mode 100644 (file)
index 84e8e7a..0000000
+++ /dev/null
@@ -1,59 +0,0 @@
-# -*- 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
-import Tkinter
-
-# 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
-
-import styles
-import import_code
-import splash
-import session
-
-def lance_eficas(code=None,fichier=None):
-    """
-        Lance l'appli EFICAS
-    """
-    # Analyse des arguments de la ligne de commande
-    options=session.parse(sys.argv)
-    code=options.code
-
-    root = Tkinter.Tk()
-    splash.init_splash(root,code=code,titre="Lancement d'EFICAS pour %s" %code)
-    splash._splash.configure(text="Chargement d'EFICAS en cours.\n Veuillez patienter ...")
-    import eficas
-    eficas.EFICAS(root,code=code)
-
-    root.mainloop()
-
diff --git a/Editeur/eficas_test.py b/Editeur/eficas_test.py
deleted file mode 100644 (file)
index 6ff3db5..0000000
+++ /dev/null
@@ -1,106 +0,0 @@
-# -*- 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 patentier l'utilisateur
-"""
-# Modules Python
-import sys
-import Tkinter
-
-# Modules Eficas
-import import_code
-import session
-
-def lance_eficas(code,fichier=None):
-    """
-        Lance l'appli EFICAS
-    """
-    options=session.parse(sys.argv)
-    root = Tkinter.Tk()
-    import eficas
-    if fichier :
-        a=eficas.EFICAS(root,code=code,fichier = fichier,test=1)
-        bureau=a.getBureau()
-    else:
-        eficas.EFICAS(root,code=code)
-
-    print bureau.JDC.report()
-    bureau.closeJDC()
-
-def duplique_fichier(code,fichier=None,root=None):
-    print code
-    print fichier
-    if root == None :
-       root = Tkinter.Tk()
-    import eficas
-    import convert
-    import generator
-    import utils
-    import string
-
-    from Editeur import session
-    if fichier != None :
-       options=session.parse(sys.argv+[fichier])
-    else :
-       options=session.parse(sys.argv)
-
-    appli=eficas.EFICAS(root,code=code,fichier = fichier,test=1)
-    format='homard'
-    if convert.plugins.has_key(format):
-       p=convert.plugins[format]()
-       p.readfile(fichier)
-       text=p.convert('exec',appli)
-       print text
-       text2=convertir(text)
-       print text2
-       cata=appli.readercata.cata
-       J=cata[0].JdC(procedure=text2,cata=cata)
-       J.analyse()
-       fileName=fichier+"_init"
-       if generator.plugins.has_key(format):
-          g=generator.plugins[format]()
-          jdc_formate=g.gener(J,format='beautifie')
-          jdc_fini = string.replace(jdc_formate,'\r\n','\n')
-          utils.save_in_file(fileName+".comm",jdc_fini,None)
-
-def convertir(texte):
-    import re
-    dict_change={"FICHIER_MED_MAILLAGE_N=":"FICHIER_MED_MAILLAGE_NP1","NOM_MED_MAILLAGE_N=":"NOM_MED_MAILLAGE_NP1"}
-    for mot in dict_change.keys():
-        if( re.search(mot,texte)):
-          indicenouveau=re.search(mot,texte).end()
-          indicefinnouveau= texte.find(",",indicenouveau)
-          avant=dict_change[mot]
-          if( re.search(avant,texte)):
-             indiceancien=re.search(avant,texte).end()+1
-             indicefinancien= texte.find(",",indiceancien)
-             valeur=texte[indiceancien:indicefinancien]
-             texte=texte[0:indicenouveau]+valeur+texte[indicefinnouveau:]
-    liste_mot_clef_None=['CRIT_RAFF_ABS','CRIT_RAFF_REL','CRIT_RAFF_PE','CRIT_DERA_ABS','CRIT_DERA_REL','CRIT_DERA_PE','NITER','NOM_MED_MAILLAGE_NP1','FICHIER_MED_MAILLAGE_NP1']
-
-    for mot in liste_mot_clef_None:
-        if( re.search(mot,texte)):
-           indice=re.search(mot,texte).end()+1
-           indicefin= texte.find(",",indice)
-           texte=texte[0:indice]+"None"+texte[indicefin:]
-    return texte
-        
diff --git a/Editeur/faq.py b/Editeur/faq.py
deleted file mode 100644 (file)
index 30764b5..0000000
+++ /dev/null
@@ -1,52 +0,0 @@
-# -*- 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 sert a afficher le texte du FAQ EFICAS
-   et à attendre l'acquittement par l'utilisateur
-"""
-# Modules Python
-import os
-import Pmw
-from Tkinter import END
-
-# Modules Eficas
-import prefs
-import fontes
-
-class FAQ:
-   def __init__(self,parent):
-      self.parent=parent
-      self.Dialog = Pmw.Dialog(parent,
-                               buttons=('Lu',),
-                               title="FAQs et limitations d'EFICAS",
-                               command = self.lu_FAQ)
-      txt = open(os.path.join(prefs.INSTALLDIR,'Editeur','faqs.txt'),'r').read()
-      Texte = Pmw.ScrolledText(self.Dialog.interior(),
-                               text_font=fontes.standard)
-      Texte.insert(END,txt)
-      Texte.pack(expand=1,fill='both')
-      self.Dialog.activate(geometry = 'centerscreenalways')
-
-   def lu_FAQ(self,event=None):
-      self.Dialog.destroy()
-
-def affiche(parent):
-   FAQ(parent)
diff --git a/Editeur/faqs.txt b/Editeur/faqs.txt
deleted file mode 100755 (executable)
index b087c34..0000000
+++ /dev/null
@@ -1,46 +0,0 @@
-
--------------------------------------------------------------------------------------------------------------
-                        FAQs et Limitations d'EFICAS
--------------------------------------------------------------------------------------------------------------
-
-
-1. Mots réservés :
-
-        Tous les mots du langage Python sont des mots réservés.
-        On ne peut donc pas appeler une variable ou un concept 'fin' ou 'dir'
-        Pour la liste complète de ces mots-clés, veuillez vous référer à la 
-        documentation Python
-
-2. Concepts réentrants :
-
-        Ne pas indiquer par un '&' devant son nom qu'un concept est utilisé comme
-        concept réentrant. En effet EFICAS le sait !
-
-3. Carte commentaire :
-
-        La carte commentaire est désormais le '#' (dièse) au lieu du '%' (pourcent)
-   Les commentaires sont gérés comme des objets de même niveau que les
-   commandes ; il n'est plus possible de placer des commentaires "dans"
-   une commande. Attention, lors de la traduction d'un fichier de version 5
-   en 6, les commentaires "dans" les commandes seront perdus.
-
-4. Nommer le concept produit par un opérateur :
-
-        Vous ne pouvez nommer le concept produit d'un opérateur que lorsque
-        celui-ci aura été entièrement et correctement rempli.
-
-5. Règle de rémanence dans les mots-clés facteurs répétés :
-
-        La règle de rémanence qui permettait pour certains mots-clés facteurs
-        et pour certains de leurs mots-clés simples de ne pas répeter la valeur
-        de ces derniers dans toutes les occurrences du mot-clé facteur n'est pas 
-        connue d'EFICAS.
-        En conséquence, vous devez répéter les mots-clés simples concernés dans 
-        toutes les occurrences des mots-clés facteurs.
-
-6. Besoin d'aide ?
-        
-        La documentation d'utilisation d'EFICAS a pris un peu de retard sur le produit ...
-        Néanmoins, vous disposez sur la plupart des panneaux contextuels ( les panneaux à
-        droite de l'arbre) d'une aide en ligne que vous pouvez activer en maintenant le 
-        bouton droit de votre souris enfoncé.
diff --git a/Editeur/fenetre_mc_inconnus.py b/Editeur/fenetre_mc_inconnus.py
deleted file mode 100644 (file)
index 35b118a..0000000
+++ /dev/null
@@ -1,223 +0,0 @@
-# -*- 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 *
-import copy
-
-# Modules Eficas
-from centerwindow import centerwindow
-
-class fenetre_mc_inconnus :
-    """
-       Cette classe sert à construire la fenêtre qui apparaît dans EFICAS 
-       lorsque des mots-clés inconnus ont été trouvés dans le fichier de 
-       commandes que l'on est en train de lire
-    """
-    def __init__(self,l_mc):
-       self.l_mc = l_mc
-       self.fenetre = Toplevel()
-       self.fenetre.withdraw()
-       self.fenetre.geometry("400x400+0+0")
-       self.fenetre.title("Mots-clés inconnus dans le fichier de commandes")
-       self.init()
-       self.init_frames()
-       self.init_label()
-       self.init_liste_mc()
-       self.init_boutons()
-       centerwindow(self.fenetre)
-       self.fenetre.deiconify()
-
-    def init(self) :
-       """
-       Initialise les structures de données
-       """
-       self.new_l_mc = []
-       for mc in self.l_mc :
-           self.new_l_mc.append(copy.copy(mc))
-       self.mc_courant = None
-       self.var_quit = IntVar(0)
-       self.entry_courante = None
-               
-    def init_frames(self):
-       """
-       Création des 2 frames devant contenir le label et la liste des MC inconnus 
-       """
-       self.frame1 = Frame(self.fenetre)
-       self.frame2 = Frame(self.fenetre)
-       self.frame3 = Frame(self.fenetre)
-       self.frame1.place(relx=0,rely=0,relheight=0.2,relwidth=1)
-       self.frame2.place(relx=0,rely=0.2,relheight=0.6,relwidth=1)
-       self.frame3.place(relx=0,rely=0.8,relheight=0.2,relwidth=1)
-    
-    def init_label(self):
-       """
-       Affichage du label dans la zone concernée
-       """
-       txt = " Un ou plusieurs mots-clés inconnus ont été trouvés dans le fichier de commandes."
-       #txt = txt + "En cliquant sur leur nom, vous pourrez soit corriger l'orthographe soit supprimer ce mot-clé"
-       self.fenetre.update_idletasks()
-       Label(self.frame1,
-             text = txt,
-             wraplength = int(self.frame1.winfo_width()*0.8),
-             justify = 'center').place(relx=0.5,rely=0.5,anchor='center')   
-    
-    
-    def init_liste_mc(self):
-       """
-       Affiche les mots-clés à modifier ou supprimer  
-       """
-       i=0
-       self.widgets=[]
-       for mc in self.l_mc :
-           # mc est une liste :
-           # mc contient comme premiers arguments l'étape et éventuellement les blocs, mcfact ...
-           # et contient comme 2 derniers éléments le nom du mot-clé et sa valeur
-           path_mc = self.get_path(mc[0:-2])
-           nom_mc  = mc[-2]
-           lab=Label(self.frame2,text = path_mc)
-           lab.grid(row=i,column=1,sticky=W)
-           e = Entry(self.frame2)
-           e.grid(row=i,column=0,sticky=W)
-           e.insert(END,nom_mc)
-           #e.bind("<Button-1>",lambda event,en=e,m=mc,s=self : s.select_mc(m,en))
-           #e.bind("<Return>",lambda e,s=self : s.modifie_mc())
-           e.configure(relief='flat',state='disabled')
-           self.widgets.append((e,lab))
-           i=i+1
-
-    def init_boutons(self):
-        """
-        Construit les boutons Modifier,Supprimer et Fermer 
-        Les deux premiers sont inactifs tant qu'aucun mot-clé n'est sélectionné
-        """
-        self.b_mod = Button(self.frame3,
-                            text = "Modifier",
-                            disabledforeground = 'grey35',
-                            state='disabled',
-                            command = self.modifie_mc)
-        self.b_sup = Button(self.frame3,
-                            text = "Supprimer",
-                            disabledforeground = 'grey35',
-                            state='disabled',
-                            command = self.supprime_mc)
-        self.b_quit = Button(self.frame3,
-                            text = "Fermer",
-                            command = self.quit)
-        #self.b_mod.place(relx=0.25,rely=0.5,anchor='center')
-        #self.b_sup.place(relx=0.50,rely=0.5,anchor='center')
-        #self.b_quit.place(relx=0.75,rely=0.5,anchor='center')
-        self.b_quit.place(relx=0.50,rely=0.5,anchor='center')
-                                
-    def wait_new_list(self):
-        """
-        Cette méthode rend cette toplevel bloquante.
-        Dès que la variable var_quit est modifiée, on continue l'exécution de cette
-        méthode (et on quitte)
-        """
-        self.fenetre.wait_variable(self.var_quit)
-        self.fenetre.destroy()
-        return self.new_l_mc
-                           
-    def get_path(self,l_o):
-        """
-        Construit la chaîne de caractère contenant le chemin d'accès complet du mot-clé
-        """
-        txt = ''
-        for o in l_o :
-           txt = txt + o.nom+'/'
-        # on enlève le dernier slash en trop
-        txt = txt[0:-1]
-        return txt    
-    
-    def select_mc(self,mc,entry):
-        """
-        Enregistre le mot-clé passé en argument comme mot-clé courant
-        Active les boutons Modifier et Supprimer
-        """
-        self.desactive_entry()
-        self.mc_courant     = mc
-        self.entry_courante = entry
-        self.active_boutons()
-        self.active_entry()
-
-    def modifie_mc(self):
-        """
-        Modifie le nom du mot-clé en prenant la nouvelle valeur lue dans entry_courante
-        """
-        new_nom_mc = self.entry_courante.get()
-        index = self.l_mc.index(self.mc_courant)
-        new_mc = self.new_l_mc[index]
-        new_mc[-2] = new_nom_mc
-        objet_pere = self.mc_courant[-3]
-        
-        self.desactive_boutons()
-        self.desactive_entry()
-
-    def supprime_mc(self):
-        """
-        Supprime le mot-clé courant de la liste
-        """
-        index = self.l_mc.index(self.mc_courant)
-        self.new_l_mc[index] = None
-        e,lab=self.widgets[index]
-        e.grid_remove()
-        lab.grid_remove()
-        self.desactive_boutons()
-        self.desactive_entry()        
-        
-    def desactive_boutons(self):
-        """
-        Désactive les boutons Modifier et Supprimer
-        """
-        self.b_mod.configure(state='disabled')
-        self.b_sup.configure(state='disabled')
-                
-    def active_boutons(self):
-        """
-        Active les boutons Modifier et Supprimer
-        """
-        self.b_mod.configure(state='normal')
-        self.b_sup.configure(state='normal')
-
-    def desactive_entry(self):
-        """
-        Désactive l'entry courante si elle existe
-        """
-        if self.entry_courante :
-           self.entry_courante.configure(state='disabled',relief='flat')
-           
-    def active_entry(self):
-        """
-        Active l'entry courante si elle existe
-        """
-        if self.entry_courante :
-           self.entry_courante.configure(state='normal',relief='sunken')
-                      
-    def quit(self):
-        """
-        Permet de fermer la fenêtre
-        """
-        self.var_quit.set(1)
-
-if __name__ == '__main__':
-   fenetre_mc_inconnus(('toto','titi'))
diff --git a/Editeur/fonctionpanel.py b/Editeur/fonctionpanel.py
deleted file mode 100644 (file)
index a566158..0000000
+++ /dev/null
@@ -1,293 +0,0 @@
-# -*- 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 Tkinter import *
-import Pmw
-from copy import copy,deepcopy
-import traceback
-
-# Modules Eficas
-import Objecttreeitem
-import prefs
-import panels
-import images
-from widgets import ListeChoix
-from widgets import FenetreDeSelection
-from widgets import askopenfilename
-from widgets import showinfo
-
-from Noyau.N_CR import justify_text
-from utils import substract_list
-from plusieursbasepanel import PLUSIEURS_BASE_Panel
-
-
-class FONCTION_Panel(PLUSIEURS_BASE_Panel):
-  def makeValeurPage(self,page):
-      """
-      Crée la page de saisie d'une liste de valeurs à priori quelconques,
-      cad qui ne sont  pas à choisir dans une liste prédéfinie
-      """
-      genea=self.node.item.get_genealogie()
-      if "VALE" in genea:
-        self.nb_valeurs=2
-      if "VALE_C" in genea:
-        self.nb_valeurs=3
-      # On récupère la bulle d'aide du panneau, l'objet, l'aide,min et max (cardinalité de la liste),
-      # et la liste des valeurs déjà affectées à l'objet courant
-      bulle_aide=self.get_bulle_aide()
-      objet_mc = self.node.item.get_definition()
-      aide = self.get_aide()
-      aide = justify_text(texte=aide)
-      min,max = self.node.item.GetMinMax()
-      l_valeurs = self.node.item.GetListeValeurs()
-      l2_valeurs=self.decoupeListeValeurs(l_valeurs)
-
-      # création des frames globales
-      self.frame1 = Frame(page,relief='groove',bd=2)
-      self.frame2 = Frame(page)
-      self.frame1.place(relx=0.,rely=0.,relwidth=1.,relheight=0.85)
-      self.frame2.place(relx=0.,rely=0.85,relwidth=1,relheight=0.15)
-      self.frame_right = Frame(self.frame1)
-      self.frame_right.place(relx=0.35,rely=0.,relwidth=0.65,relheight=1.)
-
-      # création des frames internes
-      self.frame_valeurs = Frame(self.frame1)
-      self.frame_valeurs.place(relx=0.02,rely=0.05,relwidth=0.35,relheight=0.95)
-      self.frame_boutons_fleches = Frame(self.frame_right)
-      self.frame_boutons_fleches.place(relx=0.,rely=0.2,relwidth=0.2,relheight=0.5)
-      self.frame_choix = Frame(self.frame_right)
-      self.frame_choix.place(relx=0.2,rely=0.2,relwidth=0.7,relheight=0.5)
-      self.frame_aide = Frame(self.frame_right)
-      self.frame_aide.place(relx=0.1,rely=0.7,relwidth=0.8,relheight=0.3)
-      self.frame_boutons = Frame(self.frame2)
-      self.frame_boutons.place(relx=0.35,rely=0.,relwidth=0.5,relheight=1.)
-      for fram in (self.frame1,self.frame2,self.frame_right,self.frame_valeurs,
-                 self.frame_boutons_fleches,self.frame_choix,self.frame_aide,self.frame_boutons):
-          fram.bind("<Button-3>",lambda e,s=self,a=bulle_aide : s.parent.appli.affiche_aide(e,a))
-          fram.bind("<ButtonRelease-3>",self.parent.appli.efface_aide)
-
-      # création des objets dans les frames
-      liste_commandes_valeurs = (("<Button-1>",self.selectValeur),
-                                 ("<Button-3>",self.deselectValeur),
-                                 ("<Double-Button-1>",self.afficheValeurListe))
-      self.Liste_valeurs = ListeChoix(self,self.frame_valeurs,l2_valeurs,liste_commandes = liste_commandes_valeurs,
-                                      titre="Valeur(s) actuelle(s)")
-
-      # Création de l'entry ou de la liste des SD
-      self.label = Label(self.frame_choix,text="Valeur :")
-      self.make_entry(frame = self.frame_choix,command = self.add_double_valeur_plusieurs_base)
-      self.label.place(relx=0.05,rely=0.5)
-
-      # Création d'un bouton "Importer ..." sur le panel.
-      bouton_valeurs_fichier = Button(self.frame_choix,
-                                      text="Importer ...",
-                                      command=self.select_in_file)
-      bouton_valeurs_fichier.place(relx=0.28,rely=0.7,relwidth=0.6)
-      self.ajout_valeurs = None
-
-      # boutons Ajouter et Supprimer
-      self.bouton_add = Button(self.frame_boutons_fleches,
-                          image = images.get_image('arrow_left'),
-                          command = self.add_double_valeur_plusieurs_base)
-      self.bouton_sup = Button(self.frame_boutons_fleches,
-                          image = images.get_image('arrow_right'),
-                          command = self.sup_valeur_sans_into)
-      self.bouton_add.place(relx=0.3,rely=0.35)
-      self.bouton_sup.place(relx=0.3,rely=0.65)
-      # affichage de l'aide
-      self.frame_aide.update()
-      self.aide = Label(self.frame_aide,
-                        text = aide,
-                        justify='center',
-                        anchor='center',
-                        wraplength=int(self.frame_aide.winfo_width()*0.8))
-      self.aide.place(relx=0.5,rely=0.5,anchor='center',relwidth=1)
-      self.Liste_valeurs.affiche_liste()
-      # boutons Accepter et Annuler
-      self.bouton_accepter = Button(self.frame_boutons,
-                               text='Valider',
-                               command = lambda s=self,m=min,M=max : s.accepte_modifs_valeur_recolle(m,M))
-      self.bouton_annuler = Button(self.frame_boutons,
-                              text = 'Annuler',
-                              command = self.annule_modifs_valeur)
-      for but in (self.bouton_accepter,self.bouton_annuler):
-          but.pack(side='left',padx=4)
-
-
-  def afficheValeurListe(self,name):
-      self.display_valeur(name)
-
-  def decoupeListeValeurs(self,liste):
-      #decoupe la liste des valeurs en n ( les x puis les y)
-      nb=self.nb_valeurs
-      l_valeurs=[]
-      if (len(liste)%nb != 0):
-          message="La cardinalité n'est pas correcte, la dernière valeur est ignorée"
-          showinfo("Problème",message)
-      for i in range(len(liste)/nb) :
-          if (nb==2):
-              t=(liste[i*nb], liste[i*nb+1])
-          else:
-              t=(liste[i*nb], liste[i*nb+1], liste[i*nb+2])
-          l_valeurs.append(t)
-      return l_valeurs
-
-
-  def accepte_modifs_valeur_recolle(self,min,max):
-      l_valeurs=[]
-      l1_valeurs = self.Liste_valeurs.get_liste()
-      for val in l1_valeurs :
-          for item in val :
-             l_valeurs.append(item) 
-      self.accepte_modifs_valeur(min,max,l_valeurs)
-
-
-  def add_double_valeur_plusieurs_base(self):
-      # on verifie qu'il s agit bien d un tuple
-      # on enleve les parentheses eventuelles
-      #doublevaleur_entree,validite,commentaire=self.get_valeur_double()
-      doublevaleur_entree= self.entry.get()
-      try:
-        if doublevaleur_entree[0]=='(' :
-           doublevaleur_entree=doublevaleur_entree[1:-1]
-        if doublevaleur_entree[-1]==')' :
-           doublevaleur_entree=doublevaleur_entree[0:-2]
-        val1=doublevaleur_entree.split(',')[0] 
-        val2=doublevaleur_entree.split(',')[1] 
-        saisie=(val1,val2)
-        if (self.nb_valeurs==3):
-            val3=doublevaleur_entree.split(',')[2] 
-            saisie=(val1,val2,val3)
-        self.entry.delete(0,END)
-      except :
-        commentaire = "%s n est pas un tuple de la forme (x,y)" %`doublevaleur_entree`
-        if (self.nb_valeurs==3):
-            commentaire = "%s n est pas un tuple de la forme (x,y,z)" %`doublevaleur_entree`
-        self.parent.appli.affiche_infos(commentaire)
-        return
-
-      # et seulement d un tuple
-      try:
-        val=doublevaleur_entree.split(',')[self.nb_valeurs]
-        commentaire = "%s n est pas un tuple de la forme (x,y)" %`doublevaleur_entree`
-        if (self.nb_valeurs==3):
-            commentaire = "%s n est pas un tuple de la forme (x,y,z)" %`doublevaleur_entree`
-        self.parent.appli.affiche_infos(commentaire)
-        self.parent.appli.affiche_infos(commentaire)
-        return
-      except :
-        # c est la le cas normal
-        pass
-
-      # on verifie la validite des valeurs sont correctes
-      valeur,validite=self.node.item.eval_valeur(saisie)
-      if not validite :
-        commentaire = "impossible d'évaluer : %s " %`doublevaleur_entree`
-        self.parent.appli.affiche_infos(commentaire)
-        return
-
-      # on verifie la validite de la liste
-      liste=[]
-      l1_valeurs = self.Liste_valeurs.get_liste()
-      for val in l1_valeurs :
-          for item in val :
-             liste.append(item) 
-      validite_liste=self.node.item.valide_liste_partielle(valeur[0],liste)
-      if not validite_liste:
-        commentaire = "impossible d'ajouter %s a la liste " %`doublevaleur_entree`
-        self.parent.appli.affiche_infos(commentaire)
-        return
-      # liste a deja ete modifiee par l appel precedent a valide_liste_partielle 
-      # et contient deja valeur[0]
-      validite_liste=self.node.item.valide_liste_partielle(valeur[1],liste)
-      if not validite_liste:
-        commentaire = "impossible d'ajouter %s a la liste " %`doublevaleur_entree`
-        self.parent.appli.affiche_infos(commentaire)
-        return
-     
-      # si une valeur est selectionnee on insere apres 
-      # sinon on ajoute la valeur à la fin
-      if (self.Liste_valeurs.selection != None):
-         ligne=self.Liste_valeurs.cherche_selected_item()
-         if self.nb_valeurs==2:
-            l1_valeurs.insert(ligne,(valeur[0],valeur[1]))
-         else :
-            l1_valeurs.insert(ligne,(valeur[0],valeur[1],valeur[2]))
-      else :
-         if self.nb_valeurs==2:
-            l1_valeurs.append((valeur[0],valeur[1]))
-         else :
-            l1_valeurs.append((valeur[0],valeur[1],valeur[2]))
-      i = 0
-      while i < self.nb_valeurs : 
-         self.set_valeur_texte(saisie[i])
-         i=i+1
-      self.Liste_valeurs.put_liste(l1_valeurs)
-      self.Liste_valeurs.affiche_liste()
-
-
-  def display_valeur(self,val=None):
-      """
-      Affiche la valeur passée en argument dans l'entry de saisie.
-      Par défaut affiche la valeur du mot-clé simple
-      Doit être redéfinie pour un pb avec les parametres dans un tuple
-      """
-      if not val :
-          valeur = self.node.item.object.getval()
-      else:
-          valeur = val
-      if not valeur : return
-
-      try:
-        affiche="("
-        separe=""
-        for val in valeur:
-            affiche=affiche+separe+str(val)
-            separe=","
-        affiche=affiche+")"
-        self.entry.delete(0,END)
-        self.entry.insert(0,affiche)
-      except :
-        self.entry.delete(0,END)
-
-# Surcharge de select in file pour prendre en compte la saisie de tuple
-  def select_in_file(self):
-      """ Permet d'ouvrir un fichier choisi par l'utilisateur. """
-      nom_fichier = askopenfilename(title="Choix fichier :")
-
-      if not nom_fichier:
-          return
-
-      try:
-          f = open(nom_fichier, "rb")
-          selection_texte = f.read()
-          f.close()
-          self.add_double_valeur_plusieurs_base = FenetreDeSelection(self,
-                                                  self.node.item,
-                                                  self.parent.appli,
-                                                  titre="Sélection de valeurs",
-                                                  texte=selection_texte,
-                                                  cardinal = self.nb_valeurs)
-      except:
-          traceback.print_exc()
-          showinfo("Erreur de fichier","impossible d'ouvir le fichier "+nom_fichier)
-
diff --git a/Editeur/fontes.py b/Editeur/fontes.py
deleted file mode 100644 (file)
index 8e15892..0000000
+++ /dev/null
@@ -1,36 +0,0 @@
-# -*- 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.
-#
-#
-# ======================================================================
-standard = ("Times",10)
-standard_italique = ("Times",10,'italic')
-standard_gras = ("Times",10,'bold')
-standard_gras_souligne = ("Times",10,'bold','underline')
-
-canvas = ('times',8)
-canvas_italique = ('times',8,'italic')
-canvas_gras = ("Times",8,'bold')
-canvas_gras_italique = ("Times",10,'bold','italic')
-
-standard12 = ("Times",12)
-standard12_gras = ("Times",12,'bold')
-standard12_gras_italique = ( "times",12,'bold','italic')
-
-standardcourier10 = ("Courier",10)
-
diff --git a/Editeur/icons/__init__.py b/Editeur/icons/__init__.py
new file mode 100644 (file)
index 0000000..1260b69
--- /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 COMMUNES nécessaires
+    aux deux éditeurs graphiques QT et TK
+"""
diff --git a/Editeur/icons/empty.png b/Editeur/icons/empty.png
new file mode 100644 (file)
index 0000000..ff59051
Binary files /dev/null and b/Editeur/icons/empty.png differ
diff --git a/Editeur/images.py b/Editeur/images.py
deleted file mode 100644 (file)
index 9cdfa19..0000000
+++ /dev/null
@@ -1,67 +0,0 @@
-# -*- 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 joue le role de cache pour les images stockées
-    dans le repertoire ICONDIR
-"""
-
-import os
-import Tkinter
-
-if __name__ == '__main__':
-   # Programme de test
-   import sys
-   import images
-   root=Tkinter.Tk()
-   frame = Tkinter.Frame(root)
-   frame.pack(expand=1,fill='both')
-
-   for name in ('About24','Save24'):
-      Tkinter.Label(frame, image=images.get_image(name)).pack(side=Tkinter.TOP)
-
-   root.mainloop()
-   sys.exit()
-
-try:
-   import prefs
-   ICONDIR=prefs.ICONDIR
-except:
-   # Par defaut on utilise le repertoire local icons
-   ICONDIR=os.path.join(os.path.abspath(os.path.dirname(__file__)),'icons')
-
-dico_images={}
-
-def get_image(name):
-    if dico_images.has_key(name):
-        return dico_images[name]
-    else : 
-        fic_image = os.path.join(ICONDIR,name)
-        if not os.path.isfile(fic_image):
-           file, ext = os.path.splitext(fic_image)
-           fic_image = file + '.gif'
-        image = Tkinter.PhotoImage(file=fic_image)
-        dico_images[name]=image
-        return image
-
-def update_cache():
-   global dico_images
-   dico_images={}
-
index 942c6b4addb9982bcdba2de5b35d1c4403a89dcb..5dc27ac5c73bdcb2cd17f1d70a4bd71b46f661ac 100644 (file)
@@ -23,7 +23,8 @@
     les imports de modules Python
 """
 import sys
-import prefs
+from Aster import prefs
+
 # Ce chemin permet d'importer les modules Noyau et Validation
 # représentant le code utilisé (si fourni)
 if prefs.CODE_PATH:
diff --git a/Editeur/jdcdisplay.py b/Editeur/jdcdisplay.py
deleted file mode 100644 (file)
index c5a3eeb..0000000
+++ /dev/null
@@ -1,285 +0,0 @@
-# -*- 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 contient la classe JDCDISPLAY qui réalise l'affichage
-   du jeu de commandes sous la forme d'un arbre et de panneaux qui portent
-   les informations attachées au noeud de l'arbre sélectionné
-"""
-# Modules Python
-import types,sys
-import traceback
-import Tkinter
-import Pmw
-
-# Modules Eficas
-import panels
-from treeitemincanvas import TREEITEMINCANVAS
-from widgets import showinfo,showerror
-
-class CONFIG:
-   isdeveloppeur='NON'
-
-class JDCDISPLAY:
-   """
-       Cette classe ajoute à la class TREEITEMINCANVAS l'affichage des infos
-       attachées au noeud sélectionné dans un notebook
-       L'objet item associé au jdc est créé par la classe TREEITEMINCANVAS
-   """
-   def __init__(self,jdc,nom_jdc,appli=None,parent=None):
-      self.jdc=jdc
-      self.nom_jdc=nom_jdc
-      self.fichier=None
-      self.panel_courant=None
-
-      if not appli:
-         class Appli:
-            def __init__(self):
-               self.CONFIGURATION=CONFIG()
-            def affiche_infos(self,message):
-               print message
-               return
-
-            def efface_aide(self,event):
-               return
-
-            def affiche_aide(self,event,aide):
-               print aide
-               return
-
-         appli=Appli()
-      self.appli=appli
-
-      if not parent:
-         parent=Tkinter.Tk()
-         Pmw.initialise(parent)
-      self.parent=parent
-      self.node_selected = None
-      self.modified='n'
-
-      self.pane=Pmw.PanedWidget(self.parent,orient='horizontal')
-      self.pane.add('treebrowser',min=0.4,size=0.5)
-      self.pane.add('selected',min=0.4)
-      self.pane.pack(expand=1,fill='both')
-      self.tree=TREEITEMINCANVAS(jdc,nom_jdc,self.pane.pane('treebrowser'),
-                 self.appli,self.select_node,self.make_rmenu)
-
-   def make_rmenu(self,node,event):
-      if hasattr(node.item,'rmenu_specs'):
-         rmenu = Tkinter.Menu(self.pane.pane('treebrowser'), tearoff=0)
-         #node.select()
-         self.cree_menu(rmenu,node.item.rmenu_specs,node)
-         rmenu.tk_popup(event.x_root,event.y_root)
-
-   def cree_menu(self,menu,itemlist,node):
-      """
-            Ajoute les items du tuple itemlist
-            dans le menu menu
-      """
-      number_item=0
-      radio=None
-      for item in itemlist:
-         number_item=number_item + 1
-         if not item :
-            menu.add_separator()
-         else:
-            label,method=item
-            if type(method) == types.TupleType:
-                 # On a un tuple => on cree une cascade
-                 menu_cascade=Tkinter.Menu(menu)
-                 menu.add_cascade(label=label,menu=menu_cascade)
-                 self.cree_menu(menu_cascade,method,node)
-            elif method[0] == '&':
-                 # On a une chaine avec & en tete => on cree un radiobouton
-                 try:
-                    command=getattr(node.item,method[1:])
-                    menu.add_radiobutton(label=label,command=lambda a=self.appli,c=command,n=node:c(a,n))
-                    if radio == None:radio=number_item
-                 except:pass
-            else:
-                 try:
-                    command=getattr(node.item,method)
-                    menu.add_command(label=label,command=lambda a=self.appli,c=command,n=node:c(a,n))
-                 except:pass
-      # Si au moins un radiobouton existe on invoke le premier
-      if radio:menu.invoke(radio)
-
-   def select(self):
-      return
-
-   def unselect(self):
-      return
-
-   def select_node(self,node):
-      """
-          Cette méthode est appelée à chaque fois qu'un noeud est sélectionné
-          dans l'arbre.
-          Elle permet l'affichage du panneau correspondant au noeud sélectionné
-      """
-      if node is not self.node_selected :
-         #ATTENTION: il faut affecter l'attribut node_selected avant d'appeler 
-         # create_panel pour eviter une recursion infinie entre create_panel, 
-         # Emit, onValid, select_node
-         self.node_selected = node
-         self.create_panel(node)
-      elif self.panel_courant:
-         self.panel_courant.update_panel()
-
-   def create_panel(self,node):
-      """
-         Lance la génération du panneau contextuel de l'objet sélectionné 
-         dans l'arbre
-      """
-      if self.panel_courant:
-          # On detruit le panneau
-          self.panel_courant.destroy()
-          o=self.panel_courant
-          self.panel_courant=None
-          # Mettre à 1 pour verifier les cycles entre objets
-          # pour les panneaux
-          withCyclops=0
-          if withCyclops:
-             from Misc import Cyclops
-             z = Cyclops.CycleFinder()
-             z.register(o)
-             del o
-             z.find_cycles()
-             z.show_stats()
-             z.show_cycles()
-
-      if node is None:
-          self.panel_courant=None
-          return self.panel_courant
-
-      if node.item.isactif():
-          if hasattr(node.item,"panel"):
-              self.panel_courant=node.item.panel(self,self.pane.pane('selected'),node)
-          else:
-              raise Exception("Le noeud sélectionné n'a pas de panel associé")
-      else:
-          self.panel_courant = panels.Panel_Inactif(self,self.pane.pane('selected'),node)
-      return self.panel_courant
-
-   def init_modif(self):
-      """
-          Met l'attribut modified à 'o' : utilisé par Eficas pour savoir 
-          si un JDC doit être sauvegardé avant destruction ou non
-      """
-      self.modified = 'o'
-
-   def stop_modif(self):
-      """
-          Met l'attribut modified à 'n' : utilisé par Eficas pour savoir 
-          si un JDC doit être sauvegardé avant destruction ou non
-      """
-      self.modified = 'n'
-
-   def mainloop(self):
-      self.parent.mainloop()
-
-   def ReplaceObjectNode(self,node,new_object,nom_sd=None):
-      """
-      Cette méthode sert à remplacer l'objet pointé par node par
-      new_object.
-      Si nom_sd : on remplace un OPER et on essaie de renommer la
-      nouvelle sd par nom_sd
-      """
-      child = node.append_brother(new_object,retour='oui')
-      if child == 0:
-          self.appli.affiche_infos("Impossible de remplacer l'objet du noeud courant")
-      else:
-          self.init_modif()
-          node.delete()
-          #if nom_sd:
-              #child.item.nomme_sd(nom_sd)
-          child.select()
-          #child.update()
-
-   def doCut(self):
-      """
-      Stocke dans Eficas.noeud_a_editer le noeud à couper
-      """
-      if not self.node_selected.item.iscopiable():
-          showinfo("Copie impossible",
-                   "Cette version d'EFICAS ne permet que la copie d'objets de type 'Commande' ou mot-clé facteur")
-          return
-      self.appli.edit="couper"
-      self.appli.noeud_a_editer = self.node_selected
-
-   def doCopy(self):
-      """
-      Stocke dans Eficas.noeud_a_editer le noeud à copier
-      """
-      if not self.node_selected.item.iscopiable():
-          showinfo("Copie impossible",
-                   "La copie d'un tel objet n'est pas permise")
-          return
-      self.appli.edit="copier"
-      self.appli.noeud_a_editer = self.node_selected
-
-   def doPaste(self):
-      """
-      Lance la copie de l'objet placé dans self.appli.noeud_a_editer
-      Ne permet que la copie d'objets de type Commande ou MCF
-      """
-      try:
-         child=self.appli.noeud_a_editer.doPaste(self.node_selected)
-      except:
-         traceback.print_exc()
-         showinfo("Action de coller impossible",
-                  "L'action de coller apres un tel objet n'est pas permise")
-         return
-
-      if child == 0:
-          if self.appli.message != '':
-             showerror("Copie refusée",self.appli.message)
-             self.appli.message = ''
-          self.appli.affiche_infos("Copie refusée")
-          return
-
-      # il faut déclarer le JDCDisplay_courant modifié
-      self.init_modif()
-      # suppression éventuelle du noeud sélectionné
-      # si possible on renomme l objet comme le noeud couper
-      if self.appli.edit == "couper":
-         #nom = self.appli.noeud_a_editer.item.object.sd.nom
-         item=self.appli.noeud_a_editer.item
-         self.appli.noeud_a_editer.delete()
-         child.item.update(item)
-         #test,mess = child.item.nomme_sd(nom)
-         child.select()
-      # on rend la copie à nouveau possible en libérant le flag edit
-      self.appli.edit="copier"
-
-   def update(self):
-      """Cette methode est utilisee par le JDC associe pour 
-         signaler des modifications globales du JDC
-      """
-      self.tree.update()
-
-   def supprime(self):
-      #print "supprime",self
-      self.select_node(None)
-      self.tree.supprime()
-      self.tree=None
-      self.pane.destroy()
-
-   #def __del__(self):
-   #   print "__del__",self
diff --git a/Editeur/listeFichiers.py b/Editeur/listeFichiers.py
deleted file mode 100644 (file)
index 9a9843f..0000000
+++ /dev/null
@@ -1,81 +0,0 @@
-import string
-
-class listeFichiers :
-
-    def __init__(self,appli):
-       self.appli=appli
-       self.premiere=1
-       self.nbfich=0
-       self.rep=self.appli.CONFIGURATION.rep_user
-       self.menuFichier=self.appli.menubar.menudict['Fichier']
-       self.monFichier=self.rep+"/listefichiers"
-       self.liste_Fichiers=[] 
-       self.init_Fichier()
-       self.traite_liste()
-
-    def init_Fichier(self):
-        index=0
-        try :
-            f=open(self.monFichier)
-            while ( index < 5) :
-              ligne=f.readline()
-              if ligne != "" :
-                 l=(ligne.split("\n"))[0]
-                 self.liste_Fichiers.append(l)
-              index=index+1
-        except :
-             pass
-        try :
-            f.close()
-        except :
-             pass
-
-    def sauve_Fichier(self):
-        try :
-            if len(self.liste_Fichiers) == 0 :
-              return
-            f=open(self.monFichier,'w')
-            index=0
-            while ( index <  len(self.liste_Fichiers)):
-              ligne=self.liste_Fichiers[index]+"\n"
-              f.write(ligne)
-              index=index+1
-        except :
-             pass
-        try :
-            f.close()
-        except :
-             pass
-
-    def traite_liste(self):
-        index=0
-        for  index in range(self.nbfich):
-           self.menuFichier.delete(9)
-        self.nbfich = 0
-        index = 0
-        while( index < len(self.liste_Fichiers)) :
-            self.ajout_item(index)
-            index=index+1
-           
-    def ajout_item(self,index):
-        if self.premiere and (len(self.liste_Fichiers)!=0):
-           self.premiere=0
-           self.menuFichier.add_separator()
-        label=self.liste_Fichiers[index]
-        self.menuFichier.insert_command(8,label=label,command= lambda self=self, l=label:self.coucou (l));
-        self.nbfich=self.nbfich+1
-
-    def coucou(self,label):
-        self.appli.bureau.openJDC(file=label) 
-
-    def aOuvert(self,file):
-         if file not in self.liste_Fichiers :
-            if (len(self.liste_Fichiers) > 4) :
-               f=self.liste_Fichiers[0]
-               self.liste_Fichiers.remove(f)
-            self.liste_Fichiers.insert(len(self.liste_Fichiers),file)
-         else:
-            self.liste_Fichiers.remove(file)
-            self.liste_Fichiers.insert(len(self.liste_Fichiers),file)
-         self.traite_liste()
-         self.sauve_Fichier()
index 307abbbe208063a54456c2d8f017ea91f1ac4d70..690adb400276f448dbf9b826e8625523cabbea5c 100644 (file)
@@ -1,24 +1,15 @@
 import os
 import re
-import Tkinter
-
-# le dictionnaire sous menu est indexe parceque l'ordre des
-# recherches est important
 
 sous_menu={0:{"3D":"3D.comm"},1:{"poutre":"pou.comm"},2:{"salome":"salome.comm"},3:{"divers":"comm"}}
 
 class listePatrons :
 
-    def __init__(self,appli):
-       self.appli=appli
-       rep_ini=self.appli.CONFIGURATION.rep_ini
-       if self.appli.code != "ASTER" :
-          return
-       self.rep_patrons=rep_ini+"/../Editeur/Patrons"
+    def __init__(self):
+       repIni=os.path.dirname(os.path.abspath(__file__))
+       self.rep_patrons=repIni+"/Patrons"
        self.liste={}
        self.traite_liste()
-       self.ajout_menu()
-
 
     def traite_liste(self):
         for file in os.listdir(self.rep_patrons):
@@ -31,17 +22,3 @@ class listePatrons :
                    else :
                       self.liste[clef]=[file]
                    break
-
-    def ajout_menu(self):
-        menuFichier=self.appli.menubar.menubar
-        menu_cascade=Tkinter.Menu(menuFichier,tearoff=0)
-        menuFichier.add_cascade(label="Patrons",menu=menu_cascade)
-        for ss_menu in self.liste.keys():
-           ssmenu=Tkinter.Menu(menu_cascade,tearoff=0)
-           menu_cascade.add_cascade(label=ss_menu,menu=ssmenu)
-           for fichier in self.liste[ss_menu]:
-               ssmenu.add_command(label=fichier,command= lambda self=self, l=fichier:self.ouvre(l));
-
-    def ouvre(self,label):
-        fichier=self.rep_patrons+"/"+label
-        self.appli.bureau.openJDC(file=fichier,enregistre="non") 
diff --git a/Editeur/macrodisplay.py b/Editeur/macrodisplay.py
deleted file mode 100644 (file)
index 464d59a..0000000
+++ /dev/null
@@ -1,165 +0,0 @@
-# -*- 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 contient la classe MacroDisplay qui realise l'affichage 
-   des sous commandes d'une macro sous forme d'arbre
-"""
-# Modules Python
-import types,sys
-import Tkinter,Pmw
-
-# Modules EFICAS
-import images
-import tooltip
-import Objecttreeitem
-import compojdc
-import treewidget
-from widgets import Fenetre
-from Ihm import CONNECTOR
-
-class MACRO2TreeItem(compojdc.JDCTreeItem):
-      pass
-
-class MacroDisplay:
-  def __init__(self,appli,macroitem,nom_jdc):
-    self.fenetre = Tkinter.Toplevel()
-    self.fenetre.configure(width = 800,height=500)
-    self.fenetre.protocol("WM_DELETE_WINDOW", self.quit)
-    self.fenetre.title("Visualisation Macro_Etape")
-    self.macroitem=macroitem
-    self.jdc=macroitem.object.jdc_aux
-    self.nom_jdc=nom_jdc
-    self.appli=appli
-    self.barre=Tkinter.Frame(self.fenetre,relief="ridge",bd=2)
-    self.barre.pack(expand=0,fill=Tkinter.X)
-    if self.macroitem.object.fichier_text is not None:
-      b=Tkinter.Button(self.barre,image=images.get_image("Zoom24"),command=self.visufile)
-      b.pack(side='left')
-      tp=tooltip.TOOLTIP(b,"View file")
-    self.mainPart=Pmw.ScrolledCanvas(self.fenetre,
-                                     hull_width=600,
-                                     hull_height=500,
-                                     borderframe=1)
-    self.canvas=self.mainPart.component('canvas')
-    Pmw.Color.changecolor(self.canvas,background='gray95')
-    self.mainPart.pack(padx=10,pady=10,fill = 'both', expand = 1)
-    self.item=MACRO2TreeItem(self.appli,nom_jdc,self.jdc)
-    self.tree = treewidget.Tree(self.appli,self.item,self.mainPart,command=None,rmenu=self.make_rmenu)
-    self.tree.draw()
-    CONNECTOR.Connect(self.jdc,"close",self.onCloseView,())
-
-  def onCloseView(self):
-    self.quit()
-
-  def visufile(self):
-    Fenetre(self.appli,titre="Source du fichier inclus",texte=self.macroitem.object.fichier_text)
-
-  def make_rmenu(self,node,event):
-      if hasattr(node.item,'rmenu_specs'):
-         rmenu = Tkinter.Menu(self.canvas, tearoff=0)
-         self.cree_menu(rmenu,node.item.rmenu_specs,node)
-         rmenu.tk_popup(event.x_root,event.y_root)
-
-  def cree_menu(self,menu,itemlist,node):
-      """
-            Ajoute les items du tuple itemlist
-            dans le menu menu
-      """
-      number_item=0
-      radio=None
-      for item in itemlist:
-         number_item=number_item + 1
-         if not item :
-            menu.add_separator()
-         else:
-            label,method=item
-            if type(method) == types.TupleType:
-                 # On a un tuple => on cree une cascade
-                 menu_cascade=Tkinter.Menu(menu)
-                 menu.add_cascade(label=label,menu=menu_cascade)
-                 self.cree_menu(menu_cascade,method,node)
-            elif method[0] == '&':
-                 # On a une chaine avec & en tete => on cree un radiobouton
-                 try:
-                    command=getattr(node.item,method[1:])
-                    menu.add_radiobutton(label=label,command=lambda a=self.appli,c=command,n=node:c(a,n))
-                    if radio == None:radio=number_item
-                 except:pass
-            else:
-                 try:
-                    command=getattr(node.item,method)
-                    menu.add_command(label=label,command=lambda a=self.appli,c=command,n=node:c(a,n))
-                 except:pass
-      # Si au moins un radiobouton existe on invoke le premier
-      if radio:menu.invoke(radio)
-
-  def quit(self):
-    #print "quit",self
-    self.tree.supprime()
-    self.tree=None
-    self.fenetre.destroy()
-
-  #def __del__(self):
-  #  print "__del__",self
-
-def makeMacroDisplay(appli,macroitem,nom_item):
-  return MacroDisplay(appli,macroitem,nom_item)
-
-import treeitemincanvas
-
-class TREEITEMINCANVAS(treeitemincanvas.TREEITEMINCANVAS):
-   def __init__(self,object,nom="",parent=None,appli=None,sel=None,rmenu=None):
-      #print "TREEITEMINCANVAS",object
-      self.object=object
-      self.nom=nom
-      self.appli=appli
-      self.parent=parent
-
-      self.item=MACRO2TreeItem(self.appli,self.nom,self.object)
-      self.canvas=Pmw.ScrolledCanvas(self.parent,borderframe=1,canvas_background='gray95')
-      self.canvas.pack(padx=10,pady=10,fill = 'both', expand = 1)
-      if not sel:
-         def sel(event=None):
-            return
-      self.tree=treewidget.Tree(self.appli,self.item,self.canvas,command=sel,rmenu=rmenu)
-      self.tree.draw()
-
-import jdcdisplay
-
-class MACRODISPLAY(jdcdisplay.JDCDISPLAY):
-   def __init__(self,jdc,nom_jdc,appli=None,parent=None):
-      #print "MACRODISPLAY",jdc
-      self.jdc=jdc
-      self.nom_jdc=nom_jdc
-      self.fichier=None
-      self.panel_courant=None
-      self.appli=appli
-      self.parent=parent
-      self.node_selected = None
-      self.modified='n'
-
-      self.pane=Pmw.PanedWidget(self.parent,orient='horizontal')
-      self.pane.add('treebrowser',min=0.4,size=0.5)
-      self.pane.add('selected',min=0.4)
-      self.pane.pack(expand=1,fill='both')
-      self.tree=TREEITEMINCANVAS(jdc,nom_jdc,self.pane.pane('treebrowser'),
-                 self.appli,self.select_node,self.make_rmenu)
-
diff --git a/Editeur/menubar.py b/Editeur/menubar.py
deleted file mode 100644 (file)
index b1aea08..0000000
+++ /dev/null
@@ -1,46 +0,0 @@
-# -*- 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 Tkinter import Menu
-
-class MENUBAR:
-   def __init__(self,appli,parent):
-      # L'attribut appli pointe vers l'objet application qui détient la menubar et les autres composants
-      self.appli=appli
-      # L'attribut parent pointe vers l'objet graphique parent de la menubar
-      self.parent=parent
-      self.menubar=Menu(self.parent)
-      self.parent.configure(menu=self.menubar)
-      self.init()
-
-   try:
-      from prefs import labels
-   except:
-      labels= ('Fichier','Edition','Jeu de commandes','Catalogue','Options','Aide','Traducteur')
-
-   def init(self):
-      self.menudict={}
-      for label in self.labels:
-         menu=Menu(self.menubar,tearoff=0)
-         self.menudict[label]=menu
-         self.menubar.add_cascade(label=label,menu=menu)
-
diff --git a/Editeur/newsimppanel.py b/Editeur/newsimppanel.py
deleted file mode 100644 (file)
index ea414a0..0000000
+++ /dev/null
@@ -1,196 +0,0 @@
-# -*- 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 Tkinter import *
-import Pmw
-from copy import copy,deepcopy
-import traceback
-
-# Modules Eficas
-import Objecttreeitem
-import prefs
-import panels
-import images
-import composimp
-from widgets import ListeChoix
-from widgets import FenetreDeSelection
-
-from Noyau.N_CR import justify_text
-from utils import substract_list
-
-
-class newSIMPPanel(panels.OngletPanel):
-  """
-  Classe virtuelle servant de classe mère à toutes les classes Panel
-  servant à afficher et récupérer la valeur d'un mot-clé simple.
-  Le panel est différent suivant le type de la valeur attendu
-  """
-  def init(self):
-      """
-      Méthode appelée par le constructeur de OngletPanel :
-      construit le notebook à 2 onglets utilisé par tous les panels de
-      tous les mots-clés simples
-      """
-      nb = Pmw.NoteBook(self,raisecommand=self.raisecmd)
-      nb.pack(fill = 'both', expand = 1)
-      self.nb=nb
-      nb.add('Valeur', tab_text='Saisir valeur')
-      self.makeValeurPage(nb.page('Valeur'))
-      self.enlevebind()
-      self.creebind()
-      nb.setnaturalsize()
-      
-# ----------------------------------------------------------------------------------------
-#   Méthodes utilisées pour l'affectation de la valeur donnée par l'utilisateur
-#    au mot-clé courant
-# ----------------------------------------------------------------------------------------
-
-  def reset_old_valeur(self,name=None,mess='Valeur du mot-clé enregistrée'):
-      """
-          Enregistre  val comme valeur de self.node.item.object SANS 
-          faire de test de validité ni ré-évaluer l'ancienne valeur
-          permet de rester avec des valeurs non entrees et de ne pas 
-          ré-évaluer des entiers par exemple
-      """
-      if self.parent.modified == 'n' : self.parent.init_modif()
-      self.node.item.set_valeur(name)
-      self.parent.appli.affiche_infos(mess)
-
-  def record_valeur(self,name=None,mess='Valeur du mot-clé enregistrée'):
-      """
-          Enregistre  val comme valeur de self.node.item.object  
-          en evaluant l item et en le validant 
-          Si name n'est pas renseigné, la valeur 
-      """
-      if self.parent.modified == 'n' : self.parent.init_modif()
-      if name != None:
-          valeur = name
-          validite = 1
-      else :
-          valeurentree= self.entry.get()
-          self.entry.delete(0,END)
-          if valeurentree == '': valeurentree=None
-          valeur,validite=self.node.item.eval_valeur(valeurentree)
-          if not validite :
-                  valeur= self.entry.get()
-                  commentaire = "impossible d'évaluer : %s " %`valeurentree`
-                  self.parent.appli.affiche_infos(commentaire)
-                
-      if validite : 
-          validite,commentaire=self.node.item.valide_val(valeur)
-      if validite :
-          self.node.item.set_valeur(valeur)
-          self.parent.appli.affiche_infos(mess)
-      else :
-          self.parent.appli.affiche_infos(commentaire)
-
-# ----------------------------------------------------------------------------------------
-#   Méthodes utilisées pour la manipulation des items dans les listes de choix
-# ----------------------------------------------------------------------------------------
-  def selectValeur(self,name):
-      self.selected_valeur = name
-
-  def deselectValeur(self,name):
-      self.selectValeur = None
-
-  def sup_valeur(self,name=None):
-      """
-      Supprime la valeur selectionnée de la liste des valeurs et la rajoute
-      à la liste des choix possibles
-      """
-      if hasattr(self,'selected_valeur') :
-         if ( self.selected_valeur != None and self.selected_valeur != ''):
-            liste_valeurs = self.Liste_valeurs.get_liste()
-            liste_valeurs.remove(self.selected_valeur)
-            self.Liste_valeurs.put_liste(liste_valeurs)
-            listeActuelle=self.Liste_valeurs.get_liste()
-            liste_choix=self.node.item.get_liste_possible(listeActuelle)
-            self.Liste_choix.put_liste(liste_choix)
-            self.selected_valeur = None
-
-  def add_choix(self,name=None):
-      """
-      Ajoute le choix selectionné à la liste des valeurs et le retire
-      de la liste des choix possibles
-      """
-      
-      if hasattr(self,'selected_choix') :
-         if (self.selected_choix != None and self.selected_choix != ''):
-            min,max = self.node.item.GetMinMax()
-            liste_valeurs = self.Liste_valeurs.get_liste()
-            if len(liste_valeurs) >= max :
-                self.parent.appli.affiche_infos("La liste ne peut pas avoir plus de %d éléments" %max)
-                return
-            if (self.Liste_valeurs.selection != None):
-                ligne=self.Liste_valeurs.cherche_selected_item()
-                liste_valeurs.insert(ligne,self.selected_choix)
-            else :
-                liste_valeurs.append(self.selected_choix)
-            self.Liste_valeurs.put_liste(liste_valeurs)
-            listeActuelle=self.Liste_valeurs.get_liste()
-            liste_choix=self.node.item.get_liste_possible(listeActuelle)
-            self.Liste_choix.put_liste(liste_choix)
-            self.selected_choix = None
-
-  def selectChoix(self,name):
-      self.selected_choix = name
-
-  def deselectChoix(self,name):
-      self.selectChoix = None
-      
-  def raisecmd(self,page):
-      try:
-         self.entry.focus()
-      except:
-         pass
-
-# ----------------------------------------------------------------------------------------
-#   Méthodes utilisées pour la manipulation des items en notation scientifique
-# ----------------------------------------------------------------------------------------
-  def set_valeur_texte(self,texte_valeur) :
-      """ Sert à mettre à jour la notation scientifique"""
-      try :
-        if "R" in self.node.item.object.definition.type:
-            if texte_valeur[0] != "'":
-               clef=eval(texte_valeur)
-               if str(clef) != str(texte_valeur) :
-                  self.node.item.object.init_modif()
-                  clefobj=self.node.item.object.GetNomConcept()
-                  if not self.parent.appli.dict_reels.has_key(clefobj):
-                     self.parent.appli.dict_reels[clefobj] = {}
-                  self.parent.appli.dict_reels[clefobj][clef]=texte_valeur
-                  self.parent.appli.dict_reels[clefobj]
-                  self.node.item.object.fin_modif()
-      except:
-        pass
-
-
-  def get_valeur_texte(self,valeur) :
-     valeur_texte=""
-     if "R" in self.node.item.object.definition.type:
-        clefobj=self.node.item.object.GetNomConcept()
-        if self.parent.appli.dict_reels.has_key(clefobj):
-           if self.parent.appli.dict_reels[clefobj].has_key(valeur):
-              valeur_texte=self.parent.appli.dict_reels[clefobj][valeur]
-     return valeur_texte
diff --git a/Editeur/options.py b/Editeur/options.py
deleted file mode 100644 (file)
index 9d0da1e..0000000
+++ /dev/null
@@ -1,132 +0,0 @@
-# -*- 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 os,string
-
-# Modules Eficas
-from widgets import askopenfilename
-import panels
-
-# l'option affichage_commandes peut prendre les valeurs "groupes" ou "alphabetic"
-affichage_commandes="alphabetic"
-
-class OPTIONS:
-
-   menu_defs=[
-        ('Options',[
-                   ("Affichage commandes",(("alphabétique",'&affichage_alpha'),("groupes",'&affichage_grp'))),
-                   #("Couleur",(("fond",'change_fond'),("barre",'change_barre'))),
-                   # ("Catalogue développeur",'choix_cata_developpeur'),
-                   ('Paramètres Eficas','affichage_fichier_ini'),
-                   ('Paramètres Affichage','affichage_style_ini'),
-                      
-                   ]
-        )
-             ]
-
-   button_defs=[]
-
-   def __init__(self,appli,parent):
-      self.appli=appli
-      self.parent=parent
-
-
-   def affichage_grp(self):
-      global affichage_commandes
-      affichage_commandes="groupes"
-      if hasattr(panels,'panneauCommande'):
-         panel=panels.panneauCommande
-         parent=panel.parent
-         if parent != None :
-            parent.create_panel(parent.node_selected)
-            # si on a un panel avec plusieurs onglets
-            # on affiche Commande
-            try :
-              parent.panel_courant.nb.selectpage("Commande")
-            except :
-              pass
-
-   def affichage_alpha(self):
-
-      global affichage_commandes
-      affichage_commandes="alphabetic"
-      if hasattr(panels,'panneauCommande'):
-         panel=panels.panneauCommande
-         parent=panel.parent
-         if parent != None :
-            parent.create_panel(parent.node_selected)
-            # si on a un panel avec plusieurs onglets
-            # on affiche Commande
-            try :
-              parent.panel_courant.nb.selectpage("Commande")
-            except :
-              pass
-
-   def change_fond(self):
-      from tkColorChooser import askcolor
-      #nouvelle=askcolor(self.appli.background)
-      nouvelle=askcolor('grey')
-
-   def change_barre(self):
-       pass
-
-   def choix_cata_developpeur(self):
-      """ 
-          Cette méthode demande à l'utilisateur-développeur d'indiquer quel catalogue
-          il veut utiliser en remplacement du catalogue standard du code
-          NB : il faut que le développeur ait les droits d'écriture dans le répertoire où
-          se trouve le catalogue 
-      """
-      file = askopenfilename(title="Choix d'un catalogue personnel",
-                             defaultextension=".py",
-                             filetypes = ( ("Catalogue", "cata*.py"),))
-      if file :
-          self.parent.update_idletasks()
-          self.appli.reset_affichage_infos()
-          rep_fic = os.path.dirname(file)
-          nom_fic = string.split(os.path.basename(file),'.')[0]
-          rep_courant = os.getcwd()
-          os.chdir(rep_fic)
-          self.cata = __import__(nom_fic)
-          self.code = self.cata.CODE
-          os.chdir(rep_courant)
-          self.fic_cata = file
-          fic_cata_p = nom_fic+'_pickled.py'
-          self.fic_cata_p = os.path.join(rep_fic,fic_cata_p)
-          pile_erreurs = self.cata.erreurs_cata
-          if pile_erreurs.existe_message() :
-              messages = pile_erreurs.retourne_messages()
-              print messages
-          else :
-              # XXX ne doit pas fonctionner
-              self.catalo = catabrowser.CataItem(cata=self.cata)
-              self.Retrouve_Ordre_Cata('personnel')
-          pile_erreurs.efface()
-
-
-   def affichage_fichier_ini(self):
-       self.appli.CONFIGURATION.affichage_fichier_ini()
-
-
-   def affichage_style_ini(self):
-       self.appli.CONFIGStyle.affichage_style_ini()
diff --git a/Editeur/panels.py b/Editeur/panels.py
deleted file mode 100644 (file)
index 636473a..0000000
+++ /dev/null
@@ -1,592 +0,0 @@
-# -*- 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
-import os
-from Tkinter import *
-import Pmw
-import time
-import traceback
-
-import widgets
-from widgets import ListeChoix
-from widgets import ListeChoixParGroupes
-import prefs
-import options
-
-SEPARATEUR = '-'*30
-
-
-class Panel(Frame) :
-  """
-  Classe servant de classe mère à toutes celles représentant les
-  panneaux à afficher en fonction de la nature de l'objet en cours
-  Elle est toujours dérivée.
-  """
-  def __init__(self,parent,panneau,node) :
-      # Le parent d'un panel est un objet de la classe JDCDISPLAY ou derivee
-      # ou un objet qui a les attributs : appli (de classe APPLI ou derivee),
-      # modified et la methode init_modif
-      self.parent=parent
-      self.panneau = panneau
-      self.node=node
-      Frame.__init__(self,self.panneau)
-      self.place(x=0,y=0,relheight=1,relwidth=1)
-      self.creer_boutons()
-      self.init()
-      global panneauCommande
-      panneauCommande=self
-
-  #def __del__(self):
-  #    print "__del__",self
-
-  def update_panel(self):
-      """Methode appele pour demander une mise a jour du panneau"""
-
-  def destroy(self):
-      Frame.destroy(self)
-      self.panneau=None
-      self.parent=None
-      # Because on herite de Frame
-      self.master=None
-      # On supprime explicitement les references aux objets Tk
-      self.nb=None
-      self.fr_but=None
-      self.bouton_cata=None
-      self.bouton_doc=None
-      self.bouton_com=None
-      self.bouton_sup=None
-      #self.frame_eval=None
-      self.label=None
-      self.frame_boutons=None
-      self.frame_comment=None
-      self.frame_param=None
-      # On termine la suppression de facon brutale (objets Tk et non Tk)
-      for k in self.__dict__.keys():
-         # il est plus prudent de ne pas détruire le lien sur le Node
-         # si on voulait mettre l'attribut node à None, il faudrait
-         # que tous les appels à node.parent.select() apparaissent après
-         # toutes les autres actions liées au panel (node.item.isglobal(), ...)
-         if k != 'node' : setattr(self,k,None)
-
-  def creer_boutons(self):
-      """
-      Méthode créant les boutons se trouvant dans la partie contextuelle d'EFICAS
-      (à droite sous les onglets )
-      """
-      self.fr_but = Frame(self,height=30)
-      self.fr_but.pack(side='bottom')
-      #self.fr_but.pack(side='bottom',fill='x')
-      #self.bouton_com = Button(self.fr_but, text = 'Commentariser', command = self.ajout_commentaire, width=14)
-      #self.bouton_sup = Button(self.fr_but, text = "Supprimer", command=self.supprimer, width=14)
-      #self.bouton_doc = Button(self.fr_but, text="Documentation", command=self.visu_doc, width=14)
-      #self.bouton_cata = Button(self.fr_but, text = "Catalogue", command = self.show_catalogue, width=14)
-      self.bouton_com = Button(self.fr_but, text = 'Commentariser', command = self.ajout_commentaire)
-      self.bouton_sup = Button(self.fr_but, text = "Supprimer", command=self.supprimer)
-      self.bouton_doc = Button(self.fr_but, text="Documentation", command=self.visu_doc)
-      self.bouton_cata = Button(self.fr_but, text = "Catalogue", command = self.show_catalogue)
-
-      if self.parent.appli.CONFIGURATION.isdeveloppeur == 'OUI':
-          self.bouton_sup.pack(side='left',padx=5, pady=5)
-          self.bouton_cata.pack(side='left',padx=5, pady=5)
-          self.bouton_doc.pack(side='right',padx=5, pady=5)
-          #self.bouton_sup.place(relx=0.25,rely = 0.5,relheight = 0.8,anchor='center')
-          #self.bouton_cata.place(relx=0.5,rely = 0.5,relheight = 0.8,anchor='center')
-          #self.bouton_doc.place(relx=0.75,rely = 0.5,relheight = 0.8,anchor='center')
-      else:
-          self.bouton_sup.pack(side='left',padx=5, pady=5)
-          self.bouton_doc.pack(side='right',padx=5, pady=5)
-          #self.bouton_sup.place(relx=0.3,rely = 0.5,relheight = 0.8,anchor='center')
-          #self.bouton_doc.place(relx=0.7,rely = 0.5,relheight = 0.8,anchor='center')
-
-  def show_catalogue(self):
-      try:
-          genea = self.node.item.get_genealogie()
-          self.parent.appli.browser_catalogue_objet(genea)
-      except Exception,e:
-          traceback.print_exc()
-      
-  def efface(self):
-      self.node.efface()
-
-# ------------------------------------------------------------------------
-#     Méthodes permettant d'ajouter des commentaires, des paramètres
-#                     et des objets EVAL.
-#       Ces méthodes sont utilisées par les panneaux des JDC,ETAPE,
-#                 COMMENTAIRE et PARAMETRE
-# ------------------------------------------------------------------------
-
-  def ajout_commentaire(self,ind='after'):
-      """
-      Ajoute un commentaire à l'intérieur du JDC :
-      - si ind='after'  : l'ajoute après l'objet courant
-      - si ind='before' : l'ajoute avant.
-      """
-      if self.parent.modified == 'n' : self.parent.init_modif()
-      return self.node.append_brother("COMMENTAIRE",ind)
-    
-  def ajout_commentaire_first(self):
-      """
-      Ajoute un commentaire en début de JDC
-      """
-      if self.parent.modified == 'n' : self.parent.init_modif()
-      return self.node.append_child("COMMENTAIRE",'first')
-
-  def ajout_parametre(self,ind='after'):
-      """
-      Ajoute un parametre à l'intérieur du JDC :
-      - si ind='after'  : l'ajoute après l'objet courant
-      - si ind='before' : l'ajoute avant.
-      """
-      if self.parent.modified == 'n' : self.parent.init_modif()
-      return self.node.append_brother("PARAMETRE",ind)
-    
-  def ajout_parametre_first(self):
-      """
-      Ajoute un parametre en début de JDC
-      """
-      if self.parent.modified == 'n' : self.parent.init_modif()
-      return self.node.append_child("PARAMETRE",'first')
-
-#  def ajout_parametre_eval(self,ind='after'):
-#      """
-#      Ajoute un paramètre EVAL à l'intérieur du JDC :
-#      - si ind='after'  : l'ajoute après l'objet courant
-#      - si ind='before' : l'ajoute avant.
-#      """
-#      if self.parent.modified == 'n' : self.parent.init_modif()
-#      return self.node.append_brother("PARAMETRE_EVAL",ind)
-    
-#  def ajout_parametre_eval_first(self):
-#      """
-#      Ajoute un paramètre EVAL en début de JDC
-#      """
-#      if self.parent.modified == 'n' : self.parent.init_modif()
-#      return self.node.append_child("PARAMETRE_EVAL",'first')
-    
-# ------------------------------------------------------------------------
-   
-  def visu_doc(self):
-      """ Permet d'ouvrir le fichier doc U de la commande au format pdf avec Acrobat Reader
-        - Ne fonctionne pas sous UNIX (chemin d'accès Acrobat Reader)
-        - indication du chemin d'accès aux fichiers pdf à revoir : trop statique"""
-      cle_doc = self.node.item.get_docu()
-      if cle_doc == None : return
-      cle_doc = string.replace(cle_doc,'.','')
-      cle_doc = string.replace(cle_doc,'-','')
-      commande = self.parent.appli.CONFIGURATION.exec_acrobat
-      nom_fichier = cle_doc+".pdf"
-      fichier = os.path.abspath(os.path.join(self.parent.appli.CONFIGURATION.path_doc,
-                                       nom_fichier))
-      if os.name == 'nt':
-          os.spawnv(os.P_NOWAIT,commande,(commande,fichier,))
-      elif os.name == 'posix':
-          script ="#!/usr/bin/sh \n%s %s&" %(commande,fichier)
-          pid = os.system(script)
-      
-  def supprimer(self):
-      """
-      Suppression du noeud courant
-      """
-      # On signale au parent du panel (le JDCDisplay) une modification 
-      self.parent.init_modif()
-      self.node.delete()
-      
-  def affiche(self):
-      """ Force l'affichage des fenêtres en cours """
-      self.tkraise()
-
-  def selectMC(self,name):
-      """ On retrouve le mot-clé sous le curseur pour affichage du fr """
-      cmd=self.node.item.get_definition()
-      texte_infos = ''
-      for e in cmd.entites.keys() :
-          if e == name :
-              texte_infos=getattr(cmd.entites[e],prefs.lang)
-              break
-      if texte_infos == '' : texte_infos="Pas d'infos disponibles"
-      self.parent.appli.affiche_infos(texte_infos)
-
-  def defMC(self,name):
-      """ On ajoute un mot-clé à la commande : subnode """
-      if name == SEPARATEUR:return
-      if self.parent.modified == 'n' : self.parent.init_modif()
-      if name != "COMMENTAIRE":
-          self.node.append_child(name)
-      else :
-          self.ajout_commentaire()    
-
-  def selectCmd(self,name):
-      """ On retrouve la commande sous le curseur pour affichage du fr """
-      if name != 'COMMENTAIRE' and name != SEPARATEUR:
-          texte_infos=getattr(self.parent.jdc.get_cmd(name),prefs.lang)
-          self.parent.appli.affiche_infos(texte_infos)
-          
-  def defCmd(self,name):
-      """
-      On ajoute une commande après la commande selectionnée : after
-      ou bien on ajoute un commentaire
-      """
-      if name == SEPARATEUR:return
-      if self.parent.modified == 'n' : self.parent.init_modif()
-      if name != "COMMENTAIRE":
-          #parent=self.node.parent
-          #new_obj = parent.item.append_child(name,self.node.item.getObject())
-          #parent.children[parent.children.index(self.node)+1].select()
-          new_node = self.node.append_brother(name,'after')
-      else :
-          new_node = self.ajout_commentaire()
-
-  def defCmdFirst(self,name):
-      """ On ajoute une commande ou un commentaire au début du fichier de commandes """
-      if name == SEPARATEUR:return
-      if self.parent.modified == 'n' : self.parent.init_modif()
-      if name != "COMMENTAIRE":
-          #new_obj = self.node.item.append_child(name,'first')
-          #self.node.children[0].select()
-          new_node = self.node.append_child(name,'first')
-      else :
-          new_node = self.ajout_commentaire_first()
-        
-class OngletPanel(Panel) :
-  """ Cette classe est virtuelle et doit être dérivée
-      Elle contient les principales méthodes d'affichage des différents onglets"""
-
-  global panelbind
-
-  def raisecmd(self,page):
-      self.nb.page(page).focus_set()
-      if page == 'Concept':
-          try:
-              self._any.focus()
-          except:
-              pass
-      elif page == 'Commande':
-          try:
-              self.command_entry.component('entry').focus()
-          except:
-              pass
-
-  def creebind(self):
-       self.nb.bind_all("<F1>",lambda e,s=self,num=0:s.commande_up(num))
-       self.nb.bind_all("<F2>",lambda e,s=self,num=1:s.commande_up(num))
-       self.nb.bind_all("<F3>",lambda e,s=self,num=2:s.commande_up(num))
-       self.nb.bind_all("<F4>",lambda e,s=self,num=3:s.commande_up(num))
-       OngletPanel.panelbind=self.nb
-
-  def enlevebind(self):
-       if not hasattr(OngletPanel,"panelbind"):
-          return
-       if OngletPanel.panelbind == None:
-          return
-       try:
-           OngletPanel.panelbind.unbind_all("<F1>")
-           OngletPanel.panelbind.unbind_all("<F2>")
-           OngletPanel.panelbind.unbind_all("<F3>")
-           OngletPanel.panelbind.unbind_all("<F4>")
-       except:
-           pass
-       OngletPanel.panelbind = None
-
-  def commande_up(self,num):
-      #print "commande_up de panels pour ", num
-      try :
-        OngletPanel.panelbind.selectpage(num)
-        pageNew=OngletPanel.panelbind.page(num)
-        pageNew.focus_set()
-      except :
-        pass
-
-  def affiche(self):
-      page=self.nb.getcurselection()
-      self.nb.page(page).focus_set()
-      if page == 'Concept':
-          try:
-#              _any est un pointeur sur entry
-#              component est une methode de pmw 
-#              a priori, jamais ok
-              self._any.component('entry').focus_set()
-          except:
-              pass
-      self.tkraise()
-
-# ------------------------------------------------------------------------
-#     Méthodes permettant d'afficher des pages partagées par différents
-#           types d'objets (règles,mots-clés,concept,...)
-# ------------------------------------------------------------------------
-
-  def makeConceptPage(self,page):
-      """
-      Crée la page de saisie du nom du concept
-      """
-      self.label = Label(page,text='Nom du concept :')
-      self.label.place(relx=0.1,rely=0.4)
-      self._any = Entry(page,relief='sunken')
-      self._any.place(relx=0.35,rely=0.4,relwidth=0.5)
-      self._any.bind("<Return>",lambda e,s=self:s.execConcept())
-      self._any.bind("<KP_Enter>",lambda e,s=self:s.execConcept())
-      self._any.insert(0,self.node.item.GetText())
-      self.but_ok=Button(page,text = "Valider",command=self.execConcept)
-      self.but_ok.place(relx=0.35,rely=0.8, relwidth=0.35)
-      type_sd = self.node.item.get_type_sd_prod()
-      if type_sd :
-          txt = "L'opérateur courant retourne un objet de type %s" %type_sd
-          self.label = Label(page, text = txt)
-          self.label.place(relx=0.5,rely=0.55,anchor='n')
-      self._any.focus()
-      # aide associée au panneau
-      bulle_aide="""Tapez dans la zone de saisie le nom que vous voulez donner
-      au concept retounré par l'opérateur courant et pressez <Return> pour valider"""
-      page.bind("<Button-3>", lambda e,s=self,a=bulle_aide : s.parent.appli.affiche_aide(e,a))
-      page.bind("<ButtonRelease-3>",self.parent.appli.efface_aide)
-        
-
-  def makeMoclesPage(self,page):
-      """
-      Crée la page qui affiche la liste des mots-clés que l'on peut
-      encore ajouter
-      """
-      genea =self.node.item.get_genealogie()
-      jdc = self.node.item.get_jdc()
-      liste_mc=self.node.item.get_liste_mc_ordonnee(genea,jdc.cata_ordonne_dico)
-      liste_commandes = (("<Enter>",self.selectMC),
-                         ("<Leave>",self.deselectMC),
-                         ("<Double-Button-1>",self.defMC))
-      Liste = ListeChoix(self,page,liste_mc,liste_commandes = liste_commandes,titre = "Mots-clés permis",optionReturn="oui")
-      Liste.affiche_liste()
-      # aide associée au panneau
-      bulle_aide="""Double-cliquez sur le mot-clé que vous voulez ajouter à
-      la commande en cours d'édition"""
-      Liste.MCbox.bind("<Button-3>", lambda e,s=self,a=bulle_aide : s.parent.appli.affiche_aide(e,a))
-      Liste.MCbox.bind("<ButtonRelease-3>",self.parent.appli.efface_aide)
-      if len(liste_mc) > 0 :
-         Liste.surligne(liste_mc[0])
-      self.Liste=Liste
-
-  def makeCommentairePage(self,page):
-      label = Label(page,text = "Insérer un commentaire :")
-      label.grid(column = 0, row = 2)
-      but_avant = Button(page,text = "AVANT",command = lambda s=self :s.ajout_commentaire(ind = 'before'))
-      but_apres = Button(page,text = "APRES",command = self.ajout_commentaire)
-      but_avant.grid(column = 1,row =2)
-      but_apres.grid(column = 1,row =3)
-      
-  def makeCommandePage(self,page):
-      """
-         Cree l'onglet
-      """
-      frame1 = Frame(page,height = 20)
-      frame1.pack(side='top',fill='x')
-      label = Label(frame1,text ="La commande choisie sera ajoutée\n APRES la commande courante")
-      label.pack(side='top')
-      frame2 = Frame(page)
-      frame2.pack(side='top',fill='both',expand=1)
-      liste_commandes = (("<Enter>",self.selectCmd),
-                         ("<Leave>",self.deselectCmd),
-                         ("<Double-Button-1>",self.defCmd))
-      if options.affichage_commandes == "alphabetic":
-         liste_cmd = self.get_liste_cmd()
-         Liste = ListeChoix(self,frame2,liste_cmd,liste_commandes = liste_commandes,
-                                   filtre='oui',titre = "Commandes",optionReturn="oui")
-      else:
-         liste_commandes=liste_commandes+(("<Return>",self.defCmd),)
-         liste_groupes,dict_groupes=self.get_groups()
-         Liste = ListeChoixParGroupes(self,frame2,liste_groupes,dict_groupes,
-                                      liste_commandes = liste_commandes,
-                                      filtre='oui',titre = "Commandes",optionReturn="oui")
-      Liste.affiche_liste()
-      self.command_entry=Liste.entry
-      # aide associée au panneau
-      bulle_aide="""Double-cliquez sur la commande que vous voulez ajouter au jeu de commandes"""
-      Liste.MCbox.bind("<Button-3>", lambda e,s=self,a=bulle_aide : s.parent.appli.affiche_aide(e,a))
-      Liste.MCbox.bind("<ButtonRelease-3>",self.parent.appli.efface_aide)
-      self.liste_command=Liste
-      global panneauCommande
-      panneauCommande=self
-
-  def makeJDCPage(self,page):
-      """
-      Crée la page correspondant à un objet de type JDC
-      """
-      liste_commandes = (("<Enter>",self.selectCmd),
-                         ("<Leave>",self.deselectCmd),
-                         ("<Double-Button-1>",self.defCmdFirst))
-      if options.affichage_commandes == "alphabetic":
-         liste_cmd = self.get_liste_cmd()
-         Liste = ListeChoix(self,page,liste_cmd,liste_commandes = liste_commandes,
-                            filtre='oui',titre = "Commandes",optionReturn="oui")
-      else:
-         liste_commandes=liste_commandes+(("<Return>",self.defCmdFirst),)
-         liste_groupes,dict_groupes=self.get_groups()
-         Liste = ListeChoixParGroupes(self,page,liste_groupes,dict_groupes,
-                                      liste_commandes = liste_commandes,
-                                      filtre='oui',titre = "Commandes",optionReturn="oui")
-      Liste.affiche_liste()
-       # aide associée au panneau
-      bulle_aide="""Double-cliquez sur la commande que vous voulez ajouter au jeu de commandes"""
-      Liste.MCbox.bind("<Button-3>", lambda e,s=self,a=bulle_aide : s.parent.appli.affiche_aide(e,a))
-      Liste.MCbox.bind("<ButtonRelease-3>",self.parent.appli.efface_aide)
-
-  def makeReglesPage(self,page) :
-      """
-      Crée la page qui affiche la liste des règles avec celle qui ne sont
-      pas respectées en rouge
-      """
-      regles = []
-      regles = self.node.item.get_regles()
-      dictionnaire = self.node.item.get_mc_presents()
-      texte_regles = []
-      l_regles_en_defaut=[]
-      if len(regles) > 0:
-        i = 0
-        for regle in regles :
-          texte_regles.append(regle.gettext())
-          texte,test = regle.verif(dictionnaire)
-          if test == 0 : l_regles_en_defaut.append(i)
-          i = i+1
-      Liste = ListeChoix(self,page,texte_regles,liste_marques=l_regles_en_defaut,active='non',titre="Règles")
-      Liste.affiche_liste()
-      # aide associée au panneau
-      bulle_aide="""Ce panneau contient la liste des règles qui s'appliquent à l'objet
-      en cours d'édition.
-      - en noir : règles valides
-      - en rouge : règles violées"""
-      Liste.MCbox.bind("<Button-3>", lambda e,s=self,a=bulle_aide : s.parent.appli.affiche_aide(e,a))
-      Liste.MCbox.bind("<ButtonRelease-3>",self.parent.appli.efface_aide)
-
-  def makeParamCommentPage_for_etape(self,page):
-      """
-      Crée la page qui offre le choix à l'utilisateur d'ajouter un commentaire
-      ou un paramètre, avant ou après le noeud courant dans l'arbre.
-      Cette page est destinée aux objets de niveau ETAPE cad à toutes les CMD,
-      les commentaires inter commandes et les paramètres
-      """
-      # les frame ...
-      self.frame_comment = Frame(page,bd=1,relief='raised')
-      self.frame_param   = Frame(page,bd=1,relief='raised')
-      self.frame_boutons = Frame(page,bd=1,relief='raised')
-      self.frame_comment.place(relx=0,rely=0,relwidth=1,relheight=0.40)
-      self.frame_param.place(relx=0,rely=0.40,relwidth=1,relheight=0.40)
-      self.frame_boutons.place(relx=0,rely=0.84,relwidth=1,relheight=0.16)
-      # remplissage de la frame commentaire
-      Label(self.frame_comment,text = "Insérer un commentaire :").place(relx=0.1,rely=0.5,anchor='w')
-      but_comment_avant = Button(self.frame_comment,
-                                 text = "AVANT "+self.node.item.get_nom(),
-                                 command = lambda s=self :s.ajout_commentaire(ind = 'before'))
-      but_comment_apres = Button(self.frame_comment,
-                                 text = "APRES "+self.node.item.get_nom(),
-                                 command = self.ajout_commentaire)
-      but_comment_avant.place(relx=0.45,rely=0.3,anchor='w',relwidth=0.45)
-      but_comment_apres.place(relx=0.45,rely=0.7,anchor='w',relwidth=0.45)
-      # remplissage de la frame paramètre
-      Label(self.frame_param,text = "Insérer un paramètre :").place(relx=0.1,rely=0.5,anchor='w')
-      but_param_avant = Button(self.frame_param,
-                                 text = "AVANT "+self.node.item.get_nom(),
-                                 command = lambda s=self :s.ajout_parametre(ind = 'before'))
-      but_param_apres = Button(self.frame_param,
-                                 text = "APRES "+self.node.item.get_nom(),
-                                 command = self.ajout_parametre)
-      but_param_avant.place(relx=0.45,rely=0.3,anchor='w',relwidth=0.45)
-      but_param_apres.place(relx=0.45,rely=0.7,anchor='w',relwidth=0.45)
-      # remplissage de la frame boutons
-      Button(self.frame_boutons,
-             text="Commentariser toute la commande",
-             command = self.comment_commande).place(relx=0.5,rely=0.5,anchor='center')
-    
-  def deselectMC(self,name):
-      self.parent.appli.affiche_infos('')
-    
-  def get_groups(self):
-      jdc=self.node.item.object.get_jdc_root()
-      return jdc.get_groups()
-
-  def get_liste_cmd(self):
-      #print "get_liste_cmd",self.node.item.object
-      jdc=self.node.item.object.get_jdc_root()
-      listeCmd = jdc.get_liste_cmd()
-      return listeCmd
-
-  def deselectCmd(self,name):
-      self.parent.appli.affiche_infos('')
-    
-  def execConcept(self):
-      """
-      Nomme le concept SD retourné par l'étape
-      """
-      if not hasattr(self,'valeur_choisie'):
-          nom = self._any.get()
-      else:
-          nom = self.valeur_choisie.get()
-      nom = string.strip(nom)
-      if nom == '' : return # si pas de nom, on ressort sans rien faire ...
-      if self.parent.modified == 'n' : self.parent.init_modif()
-      test,mess = self.node.item.nomme_sd(nom)
-      #self.node.verif()
-      #self.node.racine.update()
-      self.parent.appli.affiche_infos(mess)
-  
-  def changed(self):
-      pass
-
-  def comment_commande(self):
-    """
-    Cette méthode a pour but de commentariser la commande pointée par self.node
-    """
-    # On traite par une exception le cas où l'utilisateur final cherche à désactiver
-    # (commentariser) un commentaire.
-    try :
-        pos=self.node.parent.children.index(self.node)
-        commande_comment = self.node.item.get_objet_commentarise()
-        # On signale au parent du panel (le JDCDisplay) une modification
-        self.parent.init_modif()
-        self.node.parent.children[pos].select()
-    except Exception,e:
-        traceback.print_exc()
-        widgets.showerror("TOO BAD",str(e))
-    return
-
-      
-class Panel_Inactif(Panel):
-  """
-     Cette classe sert à définir un panneau dans lequel on dit que le noeud 
-     sélectionné n'est pas actif
-  """
-  def __init__(self,parent,panneau,node) :
-      self.parent=parent
-      self.panneau = panneau
-      self.node=node
-      Frame.__init__(self,self.panneau)
-      self.place(x=0,y=0,relheight=1,relwidth=1)
-      self.creer_texte()
-
-  def creer_texte(self):
-      texte = "Le noeud sélectionné ne correspond pas à un objet actif\n"
-      texte = texte + "Seules les commandes placées entre \nDEBUT/POURSUITE et FIN sont actives"
-      longueur = int(self.panneau.winfo_width()*0.8)
-      self.label = Label(self,text=texte,wraplength=longueur,justify='center')
-      self.label.place(relx=0.5,rely=0.4,relwidth=0.8,anchor='center')
-      self.bouton_sup = Button(self,
-                               text = "Supprimer",
-                               command=self.supprimer,
-                               width=14)
-      self.bouton_sup.place(relx=0.5,rely=0.8,anchor='center')
-
-
-if __name__ == "__main__" : pass
diff --git a/Editeur/panelsSalome.py b/Editeur/panelsSalome.py
deleted file mode 100644 (file)
index 6381ba7..0000000
+++ /dev/null
@@ -1,286 +0,0 @@
-# -*- coding: utf-8 -*-
-print "Import de panelsSalome"
-
-from Tkinter import *
-from widgets import ListeChoix
-from widgets import showerror
-
-from fonctionpanel      import FONCTION_Panel
-from shellpanel         import SHELLPanel
-from plusieursintopanel import PLUSIEURS_INTO_Panel
-from plusieursassdpanel import PLUSIEURS_ASSD_Panel
-from plusieursbasepanel import PLUSIEURS_BASE_Panel
-from plusieursbasepanel import PLUSIEURS_BASE_OR_UNELISTE_Panel
-from uniquesdcopanel    import UNIQUE_SDCO_Panel
-from uniqueassdpanel    import UNIQUE_ASSD_Panel
-from uniqueintopanel    import UNIQUE_INTO_Panel
-from uniquecomppanel    import UNIQUE_COMP_Panel
-from uniquebasepanel    import UNIQUE_BASE_Panel
-from uniqueassdpanel    import UNIQUE_ASSD_Panel_Reel
-
-from Noyau.N_CR import justify_text
-
-import traceback
-import salome           # CS_pbruno à poubelliser
-import images
-
-
-
-# 2 types de commandes vont etre particularisees dans Salome
-#
-# - un cas general : 
-# Toutes les commandes possedant GROUP_NO ou GROUP_MA
-# seront surchargees d office
-# pour cela on va utiliser le dictionnaire dict_classes_salome
-# qui va permettre de changer la classe de la commande
-# ainsi si un panel en dehors de salome a pour classe PLUSIEURS_BASE_Panel
-# la classe de ce panel devient alors SALOME_PLUSIEURS_BASE_Panel
-# (pour cela voir composimp)
-
-# des commandes "autres" ne pouvant pas etre identifiées par leur nom 
-# il suffit de creer dans la classe SALOME de la commande
-# une fonction portant son nom 
-# Exemple de particularisation d un panel :
-# Supposons que l on veuille particulariser la commande
-#        - LIRE_MAILLAGE_UNITE 
-# le panel initial a pour classe UNIQUE_BASE_Panel
-# il suffit d'ajouter dans la classe derivée SALOME_UNIQUE_BASE_Panel
-# une fonction  SALOME_LIRE_MAILLAGE_UNITE
-# la classe de ce panel devient alors SALOME_UNIQUE_BASE_Panel
-# on peut surcharger les methodes nécessaires (affichage par exemple)  
-
-
-class SALOME_SHELLPanel (SHELLPanel):
-        ""
-
-class SALOME_FONCTION_Panel (FONCTION_Panel):
-        ""
-
-class SALOME_PLUSIEURS_INTO_Panel (PLUSIEURS_INTO_Panel):
-        ""
-
-class SALOME_PLUSIEURS_ASSD_Panel (PLUSIEURS_ASSD_Panel):
-        ""
-
-class SALOME_UNIQUE_INTO_Panel (UNIQUE_INTO_Panel):
-        ""
-
-class SALOME_UNIQUE_SDCO_Panel (UNIQUE_SDCO_Panel):
-        ""
-
-class SALOME_UNIQUE_ASSD_Panel (UNIQUE_ASSD_Panel):
-        ""
-
-class SALOME_UNIQUE_COMP_Panel (UNIQUE_COMP_Panel):
-        ""
-
-class SALOME_UNIQUE_ASSD_Panel_Reel (UNIQUE_ASSD_Panel_Reel):
-        ""
-
-# ------------------------------------------------------------------------------#
-# classe SALOME_PLUSIEURS_BASE_Panel
-#
-# Commandes modifiées  :  
-#        - AFFE_CHAR_MECA_DDL_IMPO_GROUP_NO
-# Methodes surchargées :  
-#        - makeValeurPage(self,page)
-#
-# ------------------------------------------------------------------------------#
-
-class SALOME_PLUSIEURS_BASE_OR_UNELISTE_Panel(PLUSIEURS_BASE_OR_UNELISTE_Panel):
-      ""        
-
-class SALOME_PLUSIEURS_BASE_Panel(PLUSIEURS_BASE_Panel):
-
-  def __init__(self,parent,panneau,node):
-      PLUSIEURS_BASE_Panel.__init__( self, parent, panneau, node )
-      #self.selected_valeur = None
-      
-  def add_valeur_plusieurs_base(self,name=None):
-      try: 
-        valeur,validite,commentaire=self.get_valeur()
-        if not valeur: # sélection dans salome        
-            strSelection = ''
-            
-            genea=self.node.item.get_genealogie()
-            kwType = None
-            for e in genea:
-                if "GROUP_NO" in e:
-                    kwType = "GROUP_NO"
-                if "GROUP_MA" in e:
-                    kwType = "GROUP_MA"            
-                
-            selection, msg = self.parent.appli.selectGroupFromSalome(kwType)
-            if selection:
-                for oneSelection in selection:
-                    strSelection +=str( oneSelection )
-                    strSelection +=','
-                            
-                strSelection = strSelection.rstrip(',')
-                self.display_valeur( strSelection )                
-                    
-        PLUSIEURS_BASE_Panel.add_valeur_plusieurs_base( self, name )
-        if msg:
-            self.parent.appli.affiche_infos(msg)
-        self.erase_valeur()
-      except:
-        print ' erreur  add_valeur_plusieurs_base' #CS_pbruno : afficher boite de dialogue ici ?          
-        
-  def makeValeurPage(self,page):
-      """
-      Crée la page de saisie d'une liste de valeurs à priori quelconques,
-      cad qui ne sont  pas à choisir dans une liste prédéfinie
-      """      
-      PLUSIEURS_BASE_Panel.makeValeurPage(self,page)
-      self.c = Button( self.frame_choix, text='Visualiser',command=self.displayInSalomeGeom )      
-      self.c.place( relx=0.3, rely=0.0,relwidth=0.55)
-      
-      
-  def displayInSalomeGeom( self ):
-      if self.selected_valeur:        
-        ok, msgError = self.parent.appli.displayShape( self.selected_valeur )
-        if not ok:
-            self.parent.appli.affiche_infos(msgError)
-      
-      
-
-
-# ------------------------------------------------------------------------------#
-# classe SALOME_UNIQUE_BASE_Panel
-#
-# Commandes modifiées  :  
-#        - LIRE_MAILLAGE_UNITE 
-# Methodes surchargées :  
-#        - makeValeurPage(self,page)
-#
-# ------------------------------------------------------------------------------#
-
-class SALOME_UNIQUE_BASE_Panel(UNIQUE_BASE_Panel):
-
-# ce dictionnaire va servir lors de la sortie d efficas
-# a creer le fichier qui sera integre au config.txt
-# pour relier une unite logique et un nom de fichier
-
-  dict_fichier_unite={}
-
-
-  def SALOME_DONNEES_HOMARD_FICHIER_MED_MAILLAGE_N(self):
-      entrychaine=salome.sg.getAllSelected()
-      if entrychaine != '':
-          self.entry2.delete(0,END)
-          try:
-              SO = salome.myStudy.FindObjectID(entrychaine[0])
-          except:
-              boo = 0
-              SO = None
-
-          FileName=''
-          if SO != None:
-              myBuilder = salome.myStudy.NewBuilder()
-              boo,FileAttr = myBuilder.FindAttribute(SO,"AttributeFileType")
-              if boo:
-                 val=FileAttr.Value()
-                 if (val !="FICHIERMED" and val != "FICHIER_RESU_MED"):
-                     boo=0
-                     showerror("Pas de Fichier MED","Cet Objet n a pas de fichier MED Associ\xe9")
-                 else:
-                     boo,FileAttr = myBuilder.FindAttribute(SO,"AttributeExternalFileDef")
-              if boo :
-                FileName=FileAttr.Value()
-              else:
-                 showerror("Pas de Fichier MED","Cet Objet n a pas de fichier MED Associ\xe9")
-          if FileName != '' :
-              self.entry.delete(0,END)
-              self.entry2.delete(0,END)
-              self.entry.insert(0,FileName)
-              self.entry2.insert(0,FileName)
-              self.valid_valeur()
-
-
-  def SALOME_DONNEES_HOMARD_TRAITEMENT_NOM_MED_MAILLAGE_N(self):
-      EntryName=''
-      entrychaine=salome.sg.getAllSelected()
-      if entrychaine != '':
-          self.entry2.delete(0,END)
-          try:
-              SO = salome.myStudy.FindObjectID(entrychaine[0])
-          except:
-              boo = 0
-              SO = None
-
-          if SO is not None:
-             myBuilder = salome.myStudy.NewBuilder()
-             ok, AtName = myBuilder.FindAttribute(SO,"AttributeName")
-             if ok:
-                EntryName=AtName.Value()
-
-      if EntryName != '':
-          self.entry.delete(0,END)
-          self.entry2.delete(0,END)
-          self.entry.insert(0,EntryName)
-          self.entry2.insert(0,EntryName)
-          self.valid_valeur()
-
-  def SALOME_DONNEES_HOMARD_FICHIER_MED_MAILLAGE_NP1(self):
-      self.SALOME_DONNEES_HOMARD_FICHIER_MED_MAILLAGE_N()
-
-  def SALOME_DEFI_GROUP_CREA_GROUP_MA_GROUP_MA(self):
-      #try: 
-      if ( 1 == 1 ) :
-        selection, msg = self.parent.appli.selectGroupFromSalome()
-        if selection:
-           strSelection =str( selection )
-           UNIQUE_BASE_Panel.valid_valeur(self,strSelection)
-        if msg:
-            self.parent.appli.affiche_infos(msg)
-        self.erase_valeur()
-      #except:
-      else :
-        print ' erreur  '
-        
-
-  def redistribue_selon_simp(self):
-      genea = self.node.item.get_genealogie()
-      commande="SALOME"
-      for i in range(0,len( genea )) :
-        commande=commande+"_"+ genea[i]
-      # --------------------------------------------------------------
-      # on verifie que la methode n est pas particularise
-      # sinon on appelle SALOME_DEFI_GROUP_CREA_GROUP_MA_GROUP_MA qui
-      # sert comme methode par defaut 
-      # --------------------------------------------------------------
-      try :
-        SALOME_UNIQUE_BASE_Panel.__dict__[commande](self)
-      except :
-         SALOME_UNIQUE_BASE_Panel.SALOME_DEFI_GROUP_CREA_GROUP_MA_GROUP_MA(self)
-
-
-
-  def makeValeurPage(self,page):
-      """
-      Crée la page de saisie d'une valeur à priori quelconque,
-      cad qui ne sont  pas à choisir dans une liste prédéfinie
-      Ajout d'un bouton pour selectionner  à partir de Salome  
-      """      
-      UNIQUE_BASE_Panel.makeValeurPage(self,page)
-      self.b = Button(self.frame_valeur,text='Relier selection',command=self.redistribue_selon_simp)
-      self.b.place(relx=0.28,rely=0.4,relwidth=0.4)
-
-#---------------------------------------------------------------------------------------
-# Correspondances entre les classes eficas et les classes salome_eficas 
-#______________________________________________________________________________________
-dict_classes_salome = { SHELLPanel : SALOME_SHELLPanel, 
-                          FONCTION_Panel       : SALOME_FONCTION_Panel,
-                          PLUSIEURS_INTO_Panel : SALOME_PLUSIEURS_INTO_Panel,
-                          PLUSIEURS_ASSD_Panel : SALOME_PLUSIEURS_ASSD_Panel,
-                          PLUSIEURS_BASE_Panel : SALOME_PLUSIEURS_BASE_Panel,
-                          PLUSIEURS_BASE_OR_UNELISTE_Panel : SALOME_PLUSIEURS_BASE_OR_UNELISTE_Panel,
-                          UNIQUE_INTO_Panel :  SALOME_UNIQUE_INTO_Panel,
-                          UNIQUE_SDCO_Panel : SALOME_UNIQUE_SDCO_Panel,
-                          UNIQUE_ASSD_Panel : SALOME_UNIQUE_ASSD_Panel,
-                          UNIQUE_ASSD_Panel_Reel : SALOME_UNIQUE_ASSD_Panel_Reel,
-                          UNIQUE_COMP_Panel : SALOME_UNIQUE_COMP_Panel,
-                          UNIQUE_BASE_Panel : SALOME_UNIQUE_BASE_Panel}
-
-dict_geom_numgroupe = { }
-dict_geom_numface = { }
diff --git a/Editeur/patches.py b/Editeur/patches.py
deleted file mode 100644 (file)
index 0bd2fc4..0000000
+++ /dev/null
@@ -1,39 +0,0 @@
-# -*- 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 contient des modifications mineures du comportement
-   du noyau ou de validation
-"""
-import string
-
-if __name__ == "__main__":
-   import Noyau.N_CR
-   print Noyau.N_CR.encadre_message(motif='!',
-texte="""- Il faut au moins un mot-clé parmi : ('DEBUT', 'POURSUITE')     
-- Il faut au moins un mot-clé parmi : ('FIN',)               
-- Il faut qu'au moins un objet de la liste : ('DEBUT', 'POURSUITE') soit suivi d'au moins un objet de la liste : ('FIN',) 
-ddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddd
-xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx,yyyyyyyyyyyyyyyy
-""")
-
-
-
diff --git a/Editeur/plusieursassdpanel.py b/Editeur/plusieursassdpanel.py
deleted file mode 100644 (file)
index 88eea05..0000000
+++ /dev/null
@@ -1,183 +0,0 @@
-# -*- 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 Tkinter import *
-import Pmw
-from copy import copy,deepcopy
-import traceback
-
-# Modules Eficas
-import Objecttreeitem
-import prefs
-import panels
-import images
-from widgets import ListeChoix
-from widgets import FenetreDeSelection
-
-from Noyau.N_CR import justify_text
-from utils import substract_list
-
-# Import des panels
-from plusieurspanel import PLUSIEURS_Panel 
-
-class PLUSIEURS_ASSD_Panel(PLUSIEURS_Panel):
-  """
-  Classe définissant le panel associé aux mots-clés qui demandent
-  à l'utilisateur de donner une liste de valeurs qui ne sont pas
-  à choisir dans une liste discrètes et qui sont de type dérivé d'ASSD
-  """
-  def makeValeurPage(self,page):
-      """
-      Génère la page de saisie de plusieurs noms de SD parmi un ensemble discret
-      de SD possibles, cad d'un type cohérent avec les types attendus par le mot-clé simple
-      """
-      # On récupère la bulle d'aide du panneau, l'objet, l'aide, min et max (cardinalité de la liste),
-      # la liste des valeurs déjà affectées à l'objet courant et la liste des SD du bon type
-      bulle_aide=self.get_bulle_aide()
-      self.ajout_valeurs=None
-      objet_mc = self.node.item.get_definition()
-      aide = self.get_aide()
-      aide = justify_text(texte=aide)
-      min,max = self.node.item.GetMinMax()
-      l_valeurs = self.node.item.GetListeValeurs()
-      l_choix=self.node.item.get_sd_avant_du_bon_type()
-      l_choix.sort()
-      # remplissage du panneau
-      self.frame_valeurs = Frame(page)
-      self.frame_valeurs.place(relx=0.05,rely=0.05,relwidth=0.35,relheight=0.7)
-      self.frame_boutons_fleches = Frame(page)
-      self.frame_boutons_fleches.place(relx=0.4,rely=0.,relwidth=0.2,relheight=0.7)
-      self.frame_choix = Frame(page)
-      self.frame_choix.place(relx=0.6,rely=0.05,relwidth=0.35,relheight=0.7)
-      self.frame_boutons = Frame(page)
-      self.frame_boutons.place(relx=0.35,rely=0.87,relwidth=0.5,relheight=0.1)
-      liste_commandes_valeurs = (("<Button-1>",self.selectValeur),
-                                 ("<Button-3>",self.deselectValeur),
-                                 ("<Double-Button-1>",self.sup_valeur_sans_into))
-      liste_commandes_choix = (("<Button-1>",self.selectChoix),
-                               ("<Button-3>",self.deselectChoix),
-                               ("<Double-Button-1>",self.add_eval_valeur_sans_into))
-      self.Liste_valeurs = ListeChoix(self,self.frame_valeurs,l_valeurs,liste_commandes = liste_commandes_valeurs,
-                                      titre="Valeur(s) actuelle(s)")
-      self.Liste_choix = ListeChoix(self,self.frame_choix,l_choix,liste_commandes = liste_commandes_choix,
-                                    titre= "Valeurs possibles")
-      self.bouton_add = Button(self.frame_boutons_fleches,
-                          image = images.get_image('arrow_left'),
-                          command = self.add_eval_valeur_sans_into)
-      self.bouton_sup = Button(self.frame_boutons_fleches,
-                          image = images.get_image('arrow_right'),
-                          command = self.sup_valeur_sans_into)
-      self.bouton_accepter = Button(self.frame_boutons,
-                               text='Valider',
-                               command = lambda s=self,m=min,M=max : s.accepte_modifs_valeur(m,M))
-      self.bouton_annuler = Button(self.frame_boutons,
-                              text = 'Annuler',
-                              command = self.annule_modifs_valeur)
-      self.bouton_add.place(relx=0.3,rely=0.35)
-      self.bouton_sup.place(relx=0.3,rely=0.65)
-      for but in (self.bouton_accepter,self.bouton_annuler):
-          but.pack(side='left',padx=4)
-      self.Liste_valeurs.affiche_liste()
-      if len(l_valeurs) > 0 :
-          liste_marque=l_valeurs[-1]
-          self.Liste_valeurs.surligne(liste_marque)
-      self.Liste_choix.affiche_liste()
-      for fram in (self.frame_valeurs,self.frame_boutons_fleches,self.frame_choix,self.frame_boutons):
-          fram.bind("<Button-3>",lambda e,s=self,a=bulle_aide : s.parent.appli.affiche_aide(e,a))
-          fram.bind("<ButtonRelease-3>",self.parent.appli.efface_aide)
-  
-  def add_eval_valeur_sans_into(self,valeurentree=None):
-      if valeurentree == None:
-         valeurentree = self.get_valeur()
-      valeur,validite=self.node.item.eval_valeur(valeurentree)
-      if not validite :
-         commentaire = "impossible d'évaluer : %s " %`valeurentree`
-         self.parent.appli.affiche_infos(commentaire)
-         return
-      self.add_valeur_sans_into(valeur)
-
-  def get_bulle_aide(self):
-      """
-      Retourne la bulle d'aide associée au panneau
-      """
-      return """Un clic sur une valeur des deux listes la sélectionne.
-      - Un clic sur la flèche gauche stocke la valeur possible sélectionnée
-      dans la liste des valeurs que vous voulez affecter au mot-clé simple
-      - Un clic sur la flèche droite déstocke la valeur du mot-clé simple
-      sélectionnée (elle apparaît alors à nouveau comme choix possible
-      dans la liste des choix à droite)
-      - Cliquez sur 'Valider' pour affecter la liste des valeurs sélectionnées
-      au mot-clé simple courant
-      - Cliquez sur 'Annuler' pour restaurer la valeur du mot-clé simple
-      avant toute modification depuis le dernier 'Valider'"""
-
-  def get_aide(self):
-      """
-      Retourne la phrase d'aide indiquant de quel type doivent être les
-      valeurs que doit entrer l'utilisateur
-      """
-      commentaire=""
-      mc = self.node.item.get_definition()
-      type = mc.type[0].__name__  
-      if len(mc.type)>1 :
-          for typ in mc.type[1:] :
-              type = type + ' ou '+typ.__name__
-      if mc.min == mc.max:
-        commentaire="Une liste de "+`mc.min`+" objets de type "+type+" est attendue"
-      else :
-        commentaire="Une liste d'objets de type "+type+" est attendue (min="+`mc.min`+",max="+`mc.max`+')'
-      aideval=self.node.item.aide()
-      commentaire=commentaire +"\n"+ aideval
-      return commentaire
-
-    
-  def sup_valeur(self,name=None):
-      """
-      Supprime la valeur selectionnée de la liste des valeurs et la rajoute
-      à la liste des choix possibles
-      """
-      liste_valeurs = self.Liste_valeurs.get_liste()
-      liste_valeurs.remove(self.selected_valeur)
-      liste_choix = self.node.item.get_definition().into
-      liste_choix = substract_list(liste_choix,liste_valeurs)
-      self.Liste_valeurs.put_liste(liste_valeurs)
-      self.Liste_choix.put_liste(liste_choix)
-      self.selected_valeur = None      
-    
-  def erase_valeur(self):
-      pass
-
-  def get_valeur(self):
-      """
-      Retourne la valeur sélectionnée dans la liste des choix
-      """
-      return self.selected_choix
-
-  def display_valeur(self,val=None):
-      """
-         Affiche la valeur passée en argument dans l'entry de saisie.
-         Par défaut affiche la valeur du mot-clé simple
-      """
-      # Il n'y a pas d'entry pour ce type de panneau
-      return
-
-    
diff --git a/Editeur/plusieursbasepanel.py b/Editeur/plusieursbasepanel.py
deleted file mode 100644 (file)
index 38831dc..0000000
+++ /dev/null
@@ -1,542 +0,0 @@
-# -*- 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 Tkinter import *
-import Pmw
-from copy import copy,deepcopy
-import traceback
-
-# Modules Eficas
-import Objecttreeitem
-import prefs
-import panels
-import images
-from widgets import showinfo
-from widgets import askopenfilename
-from widgets import ListeChoix
-from widgets import FenetreDeSelection
-from widgets import FenetreDeParametre
-
-from Noyau.N_CR import justify_text
-from Ihm.I_LASSD import LASSD
-from Extensions.parametre import PARAMETRE
-
-from utils import substract_list
-from plusieurspanel import PLUSIEURS_Panel
-from uniqueassdpanel import UNIQUE_ASSD_Panel
-
-import fontes
-import math
-
-class PLUSIEURS_BASE_Panel(PLUSIEURS_Panel):
-  """
-  Classe définissant le panel associé aux mots-clés qui demandent
-  à l'utilisateur de donner une liste de valeurs qui ne sont pas
-  à choisir dans une liste discrètes et qui sont de type de base :
-  entier, réel, string,...
-  """
-  def makeValeurPage(self,page):
-      """
-      Crée la page de saisie d'une liste de valeurs à priori quelconques,
-      cad qui ne sont  pas à choisir dans une liste prédéfinie
-      """
-      #print "Methode Utilisée par Salome"
-      # On récupère la bulle d'aide du panneau, l'objet, l'aide,min et max (cardinalité de la liste),
-      # et la liste des valeurs déjà affectées à l'objet courant
-      bulle_aide=self.get_bulle_aide()
-      objet_mc = self.node.item.get_definition()
-      aide = self.get_aide()
-      aide = justify_text(texte=aide)
-      min,max = self.node.item.GetMinMax()
-      l_valeurs = self.node.item.GetListeValeurs()
-
-      # création des frames globales
-      self.frame1 = Frame(page,relief='groove',bd=2)
-      self.frame2 = Frame(page)
-      self.frame1.place(relx=0.,rely=0.,relwidth=1.,relheight=0.85)
-      self.frame2.place(relx=0.,rely=0.85,relwidth=1,relheight=0.15)
-      self.frame_right = Frame(self.frame1)
-      self.frame_right.place(relx=0.35,rely=0.,relwidth=0.65,relheight=1.)
-
-      # création des frames internes
-      self.frame_valeurs = Frame(self.frame1)
-      self.frame_valeurs.place(relx=0.02,rely=0.05,relwidth=0.35,relheight=0.95)
-      self.frame_boutons_fleches = Frame(self.frame_right)
-      self.frame_boutons_fleches.place(relx=0.,rely=0.2,relwidth=0.2,relheight=0.5)
-      self.frame_choix = Frame(self.frame_right)
-      self.frame_choix.place(relx=0.2,rely=0.2,relwidth=0.7,relheight=0.8)
-      self.frame_aide = Frame(self.frame_right)
-      self.frame_aide.place(relx=0.1,rely=0.8,relwidth=0.8,relheight=0.2)
-      self.frame_boutons = Frame(self.frame2)
-      self.frame_boutons.place(relx=0.2,rely=0.,relwidth=1,relheight=1.)
-      for fram in (self.frame1,self.frame2,self.frame_right,self.frame_valeurs,
-                 self.frame_boutons_fleches,self.frame_choix,self.frame_aide,self.frame_boutons):
-          fram.bind("<Button-3>",lambda e,s=self,a=bulle_aide : s.parent.appli.affiche_aide(e,a))
-          fram.bind("<ButtonRelease-3>",self.parent.appli.efface_aide)
-
-      # création des objets dans les frames
-      liste_commandes_valeurs = (("<Button-1>",self.selectValeur),
-                                 ("<Button-3>",self.deselectValeur),
-                                 ("<Double-Button-1>",self.sup_valeur_sans_into))
-      self.Liste_valeurs=ListeChoix(self,self.frame_valeurs,l_valeurs,liste_commandes = liste_commandes_valeurs,
-                                      titre="Valeur(s) actuelle(s)")
-
-      # Création de l'entry ou de la liste des SD
-      # PN : pour ajouter les validators
-      self.label = Label(self.frame_choix,text="Valeur :")
-      self.make_entry(frame = self.frame_choix,command = self.add_valeur_plusieurs_base)
-      self.label.place(relx=0.05,rely=0.2)
-
-      # Création d'un bouton "Importer ..." et d'un bouton "Paramatres" sur le panel.
-      bouton_valeurs_fichier = Button(self.frame_choix,
-                                      text="Importer",
-                                      command=self.select_in_file)
-      bouton_valeurs_fichier.place(relx=0.28,rely=0.4,relwidth=0.6)
-      bouton_parametres = Button(self.frame_choix, text="Parametres", command=self.affiche_parametre)
-      bouton_parametres.place(relx=0.28,rely=0.6,relwidth=0.6)
-      self.ajout_valeurs = None
-
-      # boutons Ajouter et Supprimer
-      self.bouton_add = Button(self.frame_boutons_fleches,
-                          image = images.get_image('arrow_left'),
-                          command = self.add_valeur_plusieurs_base)
-      self.bouton_sup = Button(self.frame_boutons_fleches,
-                          image = images.get_image('arrow_right'),
-                          command = self.sup_valeur_sans_into)
-      self.bouton_add.place(relx=0.3,rely=0.35)
-      self.bouton_sup.place(relx=0.3,rely=0.65)
-      # affichage de l'aide
-      self.frame_aide.update()
-      self.aide = Label(self.frame_aide,
-                        text = aide,
-                        justify='center',
-                        anchor='center',
-                              wraplength=int(self.frame_aide.winfo_width()*0.8))
-      self.aide.place(relx=0.5,rely=0.5,anchor='center',relwidth=1)
-      self.Liste_valeurs.affiche_liste()
-      if len(l_valeurs) > 0 :
-          liste_marque=l_valeurs[-1]
-          self.Liste_valeurs.surligne(liste_marque)
-          self.selectValeur(liste_marque)
-      # boutons Accepter et Annuler
-      self.bouton_accepter = Button(self.frame_boutons,
-                               text='Valider',
-                               command = lambda s=self,m=min,M=max : s.accepte_modifs_valeur(m,M))
-      self.bouton_annuler = Button(self.frame_boutons,
-                              text = 'Annuler',
-                              command = self.annule_modifs_valeur)
-      self.bouton_accepter.place(relx=0.2, rely=0.2,relwidth=0.25)
-      self.bouton_annuler.place(relx=0.5, rely=0.2,relwidth=0.25)
-
-  def affiche_parametre(self) :
-      if self.node.item.get_liste_param_possible() != [ ]:
-         txtparam=""
-         for param in self.node.item.get_liste_param_possible():
-            txtparam=txtparam+repr(param)+"\n"
-         if txtparam=="":
-            showerror("Aucun parametre ","Pas de parametre de ce type")
-         else :
-            try :
-                    self.self.fenetreparam.destroy()
-            except:
-                pass
-            self.fenetreparam=FenetreDeParametre( self, self.node.item, self.parent.appli, txtparam)
-
-  def valid_valeur(self):
-      self.add_valeur_plusieurs_base()
-
-  def add_valeur_plusieurs_base(self,name=None):
-      if name != None :
-         valeur = name
-      else:
-         valeur,validite,commentaire=self.get_valeur()
-         if not validite :
-            self.parent.appli.affiche_infos(commentaire)
-            return
-
-      atraiter=[]
-      if type(valeur)  in (types.ListType,types.TupleType) :
-         indice = 0
-         while (indice < len(valeur)):
-            v=valeur[indice]
-            if self.node.item.wait_complex :
-               if (v== 'RI' or v == 'MP'):
-                  try :
-                     t=tuple([v,valeur[indice+1],valeur[indice+2]])
-                     atraiter.append(t)
-                     indice=indice+3
-                  except :
-                     validite=0
-                     commentaire = "Veuillez entrer le complexe sous forme aster ou sous forme python"
-                     self.parent.appli.affiche_infos(commentaire)
-                     return
-               else :     # ce n'est pas un tuple à la mode aster
-                  atraiter.append(v)
-                  indice = indice + 1
-            else:  # on n'attend pas un complexe
-              atraiter.append(v)
-              indice=indice+1
-      else:
-         atraiter.append(valeur)
-         
-      for valeur in atraiter :
-         encorevalide=self.node.item.valide_item(valeur)
-         if encorevalide :
-            listecourante=self.Liste_valeurs.get_liste()
-            encorevalide=self.node.item.valide_liste_partielle(valeur,listecourante)
-            if not encorevalide : encorevalide = -1
-         self.add_valeur_sans_into(valeur,encorevalide)
-    
-  def select_in_file(self):
-      """ Permet d'ouvrir un fichier choisi par l'utilisateur. """
-      nom_fichier = askopenfilename(title="Choix fichier :")
-
-      if not nom_fichier:
-          return
-
-      try:
-          f = open(nom_fichier, "rb")
-          selection_texte = f.read()
-          f.close()
-          self.ajout_valeurs = FenetreDeSelection(self, 
-                                                  self.node.item,
-                                                  self.parent.appli,
-                                                  titre="Sélection de valeurs",
-                                                  texte=selection_texte)
-      except:
-          traceback.print_exc()
-          showinfo("Erreur de fichier","impossible d'ouvir le fichier "+nom_fichier)
-          
-  def get_bulle_aide(self):
-      """
-      Retourne l'aide associée au panneau courant
-      """
-      return """Taper dans la boîte de saisie de droite la valeur que
-      vous voulez affecter au mot-clé simple.
-      - Cliquez sur la flèche gauche ou pressez <Return> pour la faire glisser
-      dans la liste des valeurs que vous voulez affecter au mot-clé simple
-      - Un clic sur une valeur de la liste la sélectionne
-      - Un clic sur la flèche droite ou un double-clic retire la valeur
-      sélectionnée de la liste
-      - Cliquez sur 'Valider' pour que la nouvelle valeur désirée soit affectée
-      au mot-clé simple
-      - Cliquez sur 'Annuler' pour annuler toutes les modifications faites
-      depuis le dernier clic sur 'Valider'"""
-
-  def get_aide(self):
-      """
-      Retourne la phrase d'aide indiquant de quel type de base doivent être les valeurs
-      que saisit l'utilisateur
-      """
-      commentaire=""
-      mc = self.node.item.get_definition()
-      d_aides = { 'TXM' : 'chaînes de caractères',
-                  'R'   : 'réels',
-                  'I'   : 'entiers',
-                  'C'   : 'complexes'}
-      type = mc.type[0]
-      if not d_aides.has_key(type) : return 'Type de base inconnu'
-      if mc.min == mc.max:
-          commentaire="Une liste de "+d_aides[type]+" de longueur " + `mc.min`  + " est attendue"
-      else :
-          commentaire="Une liste de "+d_aides[type]+" est attendue (min="+`mc.min`+",max="+`mc.max`+')'
-
-      aideval=self.node.item.aide()
-      commentaire=commentaire +"\n"+aideval
-      return commentaire
-
-  def make_entry(self,frame,command,x=0.28,y=0.2):
-      self.entry = Entry(frame,relief='sunken')
-      self.entry.place(relx=0.28,rely=y,relwidth=0.6)
-      self.entry.bind("<Return>",lambda e,c=command:c())
-      self.entry.bind("<KP_Enter>",lambda e,c=command:c())
-      self.entry.focus()
-
-  def get_valeur(self):
-      """
-      Retourne la valeur saisie par l'utilisateur dans self.entry
-      """
-      commentaire = ""
-      if hasattr(self,'entry'):
-         # Traitement d'une entree unique
-         valeurentree = self.entry.get()
-         if (valeurentree == None or valeurentree ==""):
-            return None,0,""
-
-         #On tente une evaluation globale (ne fait pas de vérification de validité
-         #seulement une transformation de la chaine en objet équivalent)
-         valeur,validite=self.node.item.eval_valeur(valeurentree)
-         if valeur == valeurentree:
-             #L'evaluation n'a rien donné : on a toujours la string
-             #on découpe la string sur le séparateur , si c'est possible
-             if valeurentree.find(',') != -1:
-                 valeur=[]
-                 for v in valeurentree.split(','):
-                     vsimple,validite=self.node.item.eval_valeur(v)
-                     valeur.append(vsimple)
-
-         return valeur,validite,commentaire
-
-
-        # if (valeurentree[0] != "(") and (valeurentree.find(',') < len(valeurentree)):
-        #    valeurs=[]
-        #    for v in valeurentree.split(','):
-        #      vsimple,validite=self.node.item.eval_valeur(v)
-              # Pn If ajoute  pour le panneau "double"
-              #if isinstance(vsimple,LASSD) : 
-              #         commentaire = "impossible de mélanger reels et liste prédéfinie"
-              #  validite = 0
-              #         break 
-        #      if validite :
-        #         valeurs.append(vsimple)
-        #      else:
-        #         commentaire = "impossible d'évaluer : %s " %`valeurentree`
-        #         break
-        #    valeur=valeurs
-        # else: 
-        #    valeur,validite=self.node.item.eval_valeur(valeurentree)
-        # if not validite and commentaire == "":
-        #    commentaire = "impossible d'évaluer : %s " %`valeurentree`
-        # return valeur,validite,commentaire
-      #else:
-      #   # Traitement d'une entree de type complexe
-      #   try:
-      #      valeur= (self.typ_cplx.get(),
-      #               string.atof(self.entry1.get()),
-      #               string.atof(self.entry2.get()))
-      #      return valeur,1,""
-      #   except:
-      #      #traceback.print_exc()
-      #      return None,0,"impossible d'évaluer la valeur d'entree"
-
-  def erase_valeur(self):
-      """
-      Efface la valeur donnée par l'utilisateur dans l'entry
-      """
-      if hasattr(self,'entry'):
-         self.entry.delete(0,END)
-      else:
-         self.typ_cplx.set('RI')
-         self.entry1.delete(0,END)
-         self.entry2.delete(0,END)
-
-        
-  def display_valeur(self,val=None):
-      """
-      Affiche la valeur passée en argument dans l'entry de saisie.
-      Par défaut affiche la valeur du mot-clé simple
-      """
-      if not val :
-          valeur = self.node.item.object.getval()
-      else:
-          valeur = val
-      if not valeur : return
-
-      if hasattr(self,'entry'):
-         # Traitement d'une entree unique
-         self.entry.delete(0,END)
-         self.entry.insert(0,str(valeur))
-      else:
-         # Traitement d'une entree de type complexe
-         typ_cplx,x1,x2=valeur
-         self.entry1.delete(0,END)
-         self.entry2.delete(0,END)
-         self.typ_cplx.set(typ_cplx)
-         self.entry1.setentry(x1)
-         self.entry2.setentry(x2)
-
-class PLUSIEURS_BASE_OR_UNELISTE_Panel(PLUSIEURS_BASE_Panel,UNIQUE_ASSD_Panel):
-
-  def makeValeurPage(self,page):
-      """
-      Crée la page de saisie d'une liste de valeurs à priori quelconques,
-      cad qui ne sont  pas à choisir dans une liste prédéfinie
-      """
-      # On récupère la bulle d'aide du panneau, l'objet, l'aide,min et max (cardinalité de la liste),
-      # et la liste des valeurs déjà affectées à l'objet courant
-      bulle_aide=self.get_bulle_aide()
-      objet_mc = self.node.item.get_definition()
-      aide = self.get_aide()
-      aide = justify_text(texte=aide)
-      aide2 = self.get_aide2()
-      aide2 = justify_text(texte=aide2)
-      min,max = self.node.item.GetMinMax()
-      l_valeurs = self.node.item.GetListeValeurs()
-      for i in l_valeurs:
-         if isinstance(i,LASSD) :
-            affiche_entry=l_valeurs
-            l_valeurs=()
-
-      # Il faut traiter ici pour avoir le choix entre une liste
-      # deja constituee (listr8aster) ou manuelle
-
-      # création des frames globales
-      self.frame1 = Frame(page,relief='groove',bd=2)
-      self.frame2 = Frame(page)
-      self.frame1.place(relx=0.,rely=0.,relwidth=1.,relheight=0.9)
-      self.frame2.place(relx=0.,rely=0.9,relwidth=1,relheight=0.1)
-
-      # création des frames internes dans frame1
-      self.frame_valeurs = Frame(self.frame1)
-      self.frame_valeurs.place(relx=0.02,rely=0.55,relwidth=0.35,relheight=0.45)
-      self.frame_haut = Frame(self.frame1)
-      self.frame_haut.place(relx=0.02,rely=0.02,relwidth=0.98,relheight=0.45)
-      self.frame_bas = Frame(self.frame1)
-      self.frame_bas.place(relx=0.37,rely=0.55,relwidth=0.63,relheight=0.45)
-
-      # création des frames internes dans frame_right
-      self.frame_fleches = Frame(self.frame_bas)
-      self.frame_fleches.place(relx=0.,rely=0.4,relwidth=0.2,relheight=0.5)
-      self.frame_choix = Frame(self.frame_bas)
-      self.frame_choix.place(relx=0.2,rely=0.1,relwidth=0.75,relheight=1)
-
-      # affichage de l'aide
-      self.aide = Label(self.frame_haut, text = aide, justify='center', anchor='center',)
-      self.aide.place(relx=0.72,rely=0.25,anchor='center',relwidth=1)
-      self.aide2 = Label(self.frame2, text = aide2,)
-      self.aide2.place(relx=0.4,rely=0.01,relwidth=0.6)
-
-      # Création d'un bouton "Importer ..." et d'un bouton "Parametres" sur le panel.
-      bouton_valeurs_fichier = Button(self.frame_choix,
-                                      text="Importer",
-                                      command=self.select_in_file)
-      bouton_valeurs_fichier.place(relx=0.28,rely=0.0,relwidth=0.6)
-      bouton_parametres = Button(self.frame_choix, text="Parametres", command=self.affiche_parametre)
-      bouton_parametres.place(relx=0.28,rely=0.25,relwidth=0.6)
-      self.ajout_valeurs = None
-
-
-      # Création de la liste des SD
-      liste_noms_sd = self.node.item.get_sd_avant_du_bon_type_pour_type_de_base()
-      liste_noms_sd = self.tri(liste_noms_sd)
-      self.listbox = Pmw.ScrolledListBox(self.frame_haut,
-                        items=liste_noms_sd,
-                labelpos='n',
-                #label_text="Structures de données du type\n requis parl'objet courant :",
-                label_text="Listes du type\n requis parl'objet courant :",
-                listbox_height = 6,
-                dblclickcommand=lambda s=self,c=UNIQUE_ASSD_Panel.valid_valeur : s.choose_valeur_from_list(c))
-      self.listbox.place(relx=0.00,rely=0.00,relwidth=0.4)
-
-      # On eneleve le label pour gagner de la place 
-      #self.label = Label(self.frame_choix,text="Valeur :")
-      #self.label.place(relx=0.05,rely=0.85)
-      self.make_entry(frame = self.frame_choix,command = self.add_valeur_plusieurs_base,x=0.28,y=0.55)
-      
-      # boutons Ajouter et Supprimer
-      bouton_add = Button(self.frame_fleches, image = images.get_image('arrow_left'),
-                          command = self.add_valeur_plusieurs_base)
-      bouton_sup = Button(self.frame_fleches, image = images.get_image('arrow_right'),
-                          command = self.sup_valeur_sans_into)
-      bouton_add.place(relx=0.2,rely=0.25)
-      bouton_sup.place(relx=0.2,rely=0.70)
-
-
-      # boutons Accepter et Annuler dans frame2
-      bouton_accepter = Button(self.frame2, text='Valider',
-                               command = lambda s=self,m=min,M=max : s.accepte_modifs_valeur(m,M))
-      bouton_annuler = Button(self.frame2, text = 'Annuler',
-                              command = self.annule_modifs_valeur)
-      for but in (bouton_accepter,bouton_annuler):
-          but.pack(side='left',padx=5)
-
-      # création des objets dans les frames
-      liste_commandes_valeurs = (("<Button-1>",self.selectValeur),
-                                 ("<Button-3>",self.deselectValeur),
-                                 ("<Double-Button-1>",self.sup_valeur_sans_into))
-      self.Liste_valeurs = ListeChoix(self,self.frame_valeurs,l_valeurs,
-                                      liste_commandes = liste_commandes_valeurs,
-                                      titre="Valeur(s) non-prédéfinies(s)",
-                                      fonte_titre=None
-                                      )
-
-      for fram in (self.frame1,self.frame2,self.frame_bas,self.frame_haut,self.frame_valeurs,
-                 self.frame_fleches,self.frame_choix):
-          fram.bind("<Button-3>",lambda e,s=self,a=bulle_aide: s.parent.appli.affiche_aide(e,a))
-          fram.bind("<ButtonRelease-3>",self.parent.appli.efface_aide)
-
-      self.Liste_valeurs.affiche_liste()
-      if len(l_valeurs) > 0 :
-          liste_marque=l_valeurs[-1]
-          self.Liste_valeurs.surligne(liste_marque)
-      
-  def get_aide(self):
-      """
-      Retourne la phrase d'aide indiquant de quel type de base doivent être les valeurs
-      saisies par l'utilisateur
-      """
-      commentaire="Ce motclef accepte soit un nom de liste déja définie soit une liste manuelle de valeurs"
-      return commentaire
-
-  def get_aide2(self):
-      min,max = self.node.item.GetMinMax()
-      aideval=self.node.item.aide()
-      commentaire="min : " + str(min) + ", max : " + str(max)
-      aideval=commentaire + aideval
-      return aideval
-
-  def choose_valeur_from_list(self,command):
-      """
-      Affecte à valeur choisie la sélection courante dans la liste des choix proposés
-      Exécute command
-      """
-      self.Liste_valeurs.liste=[]
-      self.Liste_valeurs.affiche_liste()
-      if len(self.listbox.get()) == 0 : return
-      choix = self.listbox.getcurselection()[0]
-      d={}
-      d["valeurentree"]=choix
-      apply(command,(self,),d)
-     
-
-
-  def tri(self,liste_noms_sd):
-      a=(3+8j)
-      d_types = { 'TXM' : type('A'),
-                  'R'   : type(3.),
-                  'I'   : type(0),
-                  'C'   : type(a)}
-
-      # On enleve seulement ceux qu'on peut
-      # Sur certaines listes, il est possible qu'on ne 
-      # sache pas déterminer le type
-      listefinale=[]
-      typespossibles=self.node.item.object.definition.type
-      typecherche = None
-      for t in typespossibles:
-          if t in d_types.keys() :
-             typecherche = d_types[t]
-             break
-      for liste in liste_noms_sd:
-          valeur,validite=self.node.item.eval_valeur(liste)
-          for mc in valeur.etape.mc_liste :
-              try :
-                 if type(mc.valeur)  in (types.ListType,types.TupleType) :
-                    typeliste=type(mc.valeur[0])
-                 else :
-                    typeliste=type(mc.valeur)
-                 if type(mc.valeur[0]) == typecherche:
-                    listefinale.append(liste)
-              except:
-                 listefinale.append(liste)
-      return listefinale
-
diff --git a/Editeur/plusieursintopanel.py b/Editeur/plusieursintopanel.py
deleted file mode 100644 (file)
index 1854e86..0000000
+++ /dev/null
@@ -1,163 +0,0 @@
-# -*- 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 Tkinter import *
-import Pmw
-from copy import copy,deepcopy
-import traceback
-
-# Modules Eficas
-import Objecttreeitem
-import prefs
-import panels
-import images
-from widgets import ListeChoix
-from widgets import FenetreDeSelection
-
-from Noyau.N_CR import justify_text
-from utils import substract_list
-
-# Import des panels
-from plusieurspanel import PLUSIEURS_Panel
-
-class PLUSIEURS_INTO_Panel(PLUSIEURS_Panel):
-  """
-  Classe servant à définir le panneau permettant d'afficher et de saisir une
-  liste de valeurs à choisir parmi une liste discrètes de valeurs possibles
-  """
-  def makeValeurPage(self,page):
-      """
-      Génère la page de saisie de plusieurs valeurs parmi un ensemble discret
-      de possibles
-      """
-      self.ajout_valeurs = None
-      # On récupère la bulle d'aide du panneau, l'objet, min et max (cardinalité de la liste),
-      # la liste des choix et la liste des valeurs
-      aide = self.get_aide()
-      aide = justify_text(texte=aide)
-      bulle_aide=self.get_bulle_aide()
-      objet_mc = self.node.item.get_definition()
-      min,max = self.node.item.GetMinMax()
-      #l_choix=list(objet_mc.into)
-      l_valeurs = self.node.item.GetListeValeurs()
-      l_choix= self.node.item.get_liste_possible(l_valeurs)
-      # reinitialisation de l_valeurs
-      l_valeurs = self.node.item.GetListeValeurs()
-
-      # remplissage du panneau
-      self.frame_valeurs = Frame(page)
-      self.frame_valeurs.place(relx=0.05,rely=0.05,relwidth=0.35,relheight=0.7)
-      self.frame_boutons_fleches = Frame(page)
-      self.frame_boutons_fleches.place(relx=0.4,rely=0.,relwidth=0.2,relheight=0.7)
-      self.frame_choix = Frame(page)
-      self.frame_choix.place(relx=0.6,rely=0.05,relwidth=0.35,relheight=0.7)
-      self.frame_boutons = Frame(page)
-      self.frame_boutons.place(relx=0.35,rely=0.87,relwidth=1,relheight=0.1)
-      self.frame_aide = Frame(page)
-      self.frame_aide.place(relx=0.1,rely=0.75,relwidth=1,relheight=0.15)
-      liste_commandes_valeurs = (("<Button-1>",self.selectValeur),
-                                 ("<Button-3>",self.deselectValeur),
-                                 ("<Double-Button-1>",self.sup_valeur))
-      liste_commandes_choix = (("<Button-1>",self.selectChoix),
-                               ("<Button-3>",self.deselectChoix),
-                               ("<Double-Button-1>",self.add_choix))
-      self.Liste_valeurs = ListeChoix(self,self.frame_valeurs,
-                                      l_valeurs,liste_commandes = liste_commandes_valeurs,
-                                      titre="Valeur(s) actuelle(s)")
-      self.Liste_choix = ListeChoix(self,self.frame_choix,l_choix,
-                                    liste_commandes = liste_commandes_choix,
-                                    titre= "Valeurs possibles")
-      self.bouton_add = Button(self.frame_boutons_fleches,
-                          #text="<--",
-                          image = images.get_image('arrow_left'),
-                          command = self.add_choix)
-      self.bouton_sup = Button(self.frame_boutons_fleches,
-                          #text="-->",
-                          image = images.get_image('arrow_right'),
-                          command = self.sup_valeur)
-      self.bouton_accepter = Button(self.frame_boutons,
-                               text='Valider',
-                               command = lambda s=self,m=min,M=max : s.accepte_modifs_valeur(m,M))
-      self.bouton_annuler = Button(self.frame_boutons,
-                              text = 'Annuler',
-                              command = self.annule_modifs_valeur)
-      self.bouton_add.place(relx=0.3,rely=0.35)
-      self.bouton_sup.place(relx=0.3,rely=0.65)
-      for but in (self.bouton_accepter,self.bouton_annuler):
-          but.pack(side='left',padx=3)
-      self.Liste_valeurs.affiche_liste()
-      if len(l_valeurs) > 0 :
-          liste_marque=l_valeurs[-1]
-          self.Liste_valeurs.surligne(liste_marque)
-          self.selectValeur(l_valeurs[-1])
-      self.Liste_choix.affiche_liste()
-      for fram in (self.frame_valeurs,self.frame_boutons_fleches,self.frame_choix,self.frame_boutons):
-          fram.bind("<Button-3>",lambda e,s=self,a=bulle_aide : s.parent.appli.affiche_aide(e,a))
-          fram.bind("<ButtonRelease-3>",self.parent.appli.efface_aide)
-      self.frame_aide.update()
-      self.aide = Label(self.frame_aide,
-                        text = aide,
-                        justify='center',
-                        anchor='center')
-                        #wraplength=int(self.frame_aide.winfo_width()*0.8))
-      self.aide.place(relx=0.3,rely=0.5,anchor='center',relwidth=1)
-
-  def get_aide(self):
-      """
-      Retourne la phrase d'aide indiquant de quel type de base doivent être les valeurs
-      que saisit l'utilisateur
-      """
-      commentaire=""
-      mc = self.node.item.get_definition()
-      d_aides = { 'TXM' : 'chaînes de caractères',
-                  'R'   : 'réels',
-                  'I'   : 'entiers',
-                  'C'   : 'complexes'}
-      type = mc.type[0]
-      if not d_aides.has_key(type) : 
-         if mc.min == mc.max:
-            return str(mc.min)+" valeur(s) est(sont) attendue(s)"
-         else :
-            return "entrez entre "+str(mc.min)+" et "+str(mc.max)+" valeurs"
-      if mc.min == mc.max:
-            commentaire="Une liste de "+str(mc.min)+" "+d_aides[type]+" est attendue"
-      else :
-            commentaire="Entre "+str(mc.min)+" et "+str(mc.max)+" valeurs de type  "+d_aides[type]+" sont attendues"
-      aideval=self.node.item.aide()
-      commentaire=commentaire + "\n" + aideval
-      return commentaire
-
-  def get_bulle_aide(self):
-      """
-      Retourne la bulle d'aide du panneau (affichée par clic droit)
-      """
-      return """Un clic sur une valeur des deux listes la sélectionne.
-      - Un clic sur la flèche gauche stocke la valeur possible sélectionnée
-      dans la liste des valeurs que vous voulez affecter au mot-clé simple
-      - Un clic sur la flèche droite déstocke la valeur du mot-clé simple
-      sélectionnée (elle apparaît alors à nouveau comme choix possible
-      dans la liste des choix à droite)
-      - Cliquez sur 'Valider' pour affecter la liste des valeurs sélectionnées
-      au mot-clé simple courant
-      - Cliquez sur 'Annuler' pour restaurer la valeur du mot-clé simple
-      avant toute modification depuis le dernier 'Valider'"""
-
diff --git a/Editeur/plusieurspanel.py b/Editeur/plusieurspanel.py
deleted file mode 100644 (file)
index ba64144..0000000
+++ /dev/null
@@ -1,177 +0,0 @@
-# -*- 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 Tkinter import *
-import Pmw
-from copy import copy,deepcopy
-import traceback
-
-# Modules Eficas
-import Objecttreeitem
-import prefs
-import panels
-import images
-from widgets import ListeChoix
-from widgets import FenetreDeSelection
-
-from Noyau.N_CR import justify_text
-from utils import substract_list
-
-# Import des panels
-from  newsimppanel import newSIMPPanel
-
-
-class PLUSIEURS_Panel(newSIMPPanel):
-  """
-  Classe virtuelle servant de classe mère à toutes celles définissant
-  un panneau pour un mot-clé simple qui attend une liste de valeurs
-  """
-  def accepte_modifs_valeur(self,min,max,liste=None):
-      """
-      Méthode qui récupère la liste des valeurs donnée par l'utilisateur
-      et l'affecte au mot-clé courant.
-      le parametre None n'est pas rempli sauf par l appel a partir de fonctionpanel
-      """
-      if liste==None:
-         l1_valeurs = self.Liste_valeurs.get_liste()
-      else:
-         l1_valeurs = liste
-
-      #nettoyage de la liste
-      l_valeurs=[]
-      for  val in l1_valeurs :
-        if val != '' and val != None :
-           l_valeurs.append(val)
-    
-      longueur = len(l_valeurs)
-      if longueur < min or longueur > max :
-          self.parent.appli.affiche_infos("Valeur refusée : nombre d'éléments incorrect dans la liste")
-          return
-      if longueur > 1:
-         valeur = tuple(l_valeurs)
-      elif longueur == 1:
-         valeur = l_valeurs[0]
-      else:
-         valeur = None
-
-      self.parent.appli.affiche_infos("Valeur acceptée")
-      self.record_valeur(valeur)
-      # fermeture de la fenêtre de sélection
-      if self.ajout_valeurs:
-          self.ajout_valeurs.quit()
-          
-  def annule_modifs_valeur(self):
-      """
-      RAZ de la liste des valeurs (annule toutes les valeurs saisies par l'utilisateur)
-      """
-      self.node.select()
-      # fermeture de la fenêtre de sélection
-      if self.ajout_valeurs:
-          self.ajout_valeurs.quit()
-          
-  def add_valeur_sans_into(self,name=None,encorevalide=1):
-      """
-      Tente d'ajouter la valeur fournie (name) à la liste courante :
-        - si la valeur est acceptable, elle est ajoutée dans la liste des valeurs
-        - sinon elle est refusée
-
-      encorevalide peut prendre les valeurs suivantes :
-
-                   - valeur 1 si le validateur trouve l item et la liste correctes
-                   - valeur 0 si le validateur trouve la valeur de l item incorrecte
-                   - valeur -1 si le validateur trouve la liste incorrecte
-      """
-      valeur = name
-      commentaire="Valeur incorrecte : ajout à la liste refusé"
-      testvalide=1
-
-      # Pas de traitement des valeurs nulles ( a priori clic involontaire
-      if (valeur == None or valeur =="") :
-          commentaire = "Pas de saisie des valeurs nulles"
-          encorevalide = -2 
-          testtype=0
-      else :
-          testtype,comment = self.node.item.object.verif_type(valeur)
-          if not testtype :
-               commentaire =comment
-               encorevalide=-2
-                
-      if (encorevalide ==0) :
-         commentaire=self.node.item.info_erreur_item()
-      if (encorevalide == -1) :
-         commentaire=self.node.item.info_erreur_liste()
-         # On traite le cas ou la liste n est pas valide pour un pb de cardinalite
-         min,max = self.node.item.GetMinMax()
-         if len(self.Liste_valeurs.get_liste()) >= max : 
-            commentaire="La liste a déjà atteint le nombre maximum d'éléments,ajout refusé"
-
-      if testvalide and (encorevalide == 1):
-         min,max = self.node.item.GetMinMax()
-
-         if testtype :
-            liste_valeurs = self.Liste_valeurs.get_liste()
-            if len(liste_valeurs) >= max :
-                commentaire="La liste a déjà atteint le nombre maximum d'éléments,ajout refusé"
-            else :
-               if (self.Liste_valeurs.selection != None):
-                   ligne=self.Liste_valeurs.cherche_selected_item()
-                   liste_valeurs.insert(ligne,valeur)
-               else :
-                   liste_valeurs.append(valeur)
-               try :
-                  self.set_valeur_texte(str(self.entry.get()))
-               except :
-                  pass
-               self.Liste_valeurs.put_liste(liste_valeurs)
-               self.erase_valeur()
-               commentaire="Nouvelle valeur acceptée"
-         else :
-            commentaire ="Type de la valeur incorrecte"
-
-      self.parent.appli.affiche_infos(commentaire)
-
-  def sup_valeur_sans_into(self,name=None):
-      """
-      Méthode qui sert à retirer de la liste des valeurs la valeur sélectionnée
-      """
-      try:
-          self.Liste_valeurs.remove_selected_item()
-          self.display_valeur(self.selected_valeur)
-          self.selected_valeur = None      
-      except:
-          # la valeur sélectionnée n'est pas dans la liste
-          return
-
-  def display_valeur(self,val=None):
-      """
-      Affiche la valeur passée en argument dans l'entry de saisie.
-      Par défaut affiche la valeur du mot-clé simple
-      """
-      if not val :
-          #valeur = self.node.item.getval()
-          valeur = self.node.item.object.getval()
-      else:
-          valeur = val
-      self.entry.delete(0,END)
-      if not valeur : return
-      self.entry.insert(0,str(valeur))
-      
diff --git a/Editeur/readercata.py b/Editeur/readercata.py
deleted file mode 100644 (file)
index 1555f38..0000000
+++ /dev/null
@@ -1,450 +0,0 @@
-# -*- 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 sert à lire un catalogue et à construire
-    un objet CataItem pour Eficas.
-    Il s'appuie sur la classe READERCATA
-"""
-# Modules Python
-import time
-import os,sys,py_compile
-import traceback
-import cPickle
-import Pmw
-
-# Modules Eficas
-import prefs
-import splash
-import fontes
-import analyse_catalogue
-from Noyau.N_CR import CR
-from widgets import showinfo,showerror
-from widgets import Fenetre
-from utils import init_rep_cata_dev
-
-#import catabrowser
-import autre_analyse_cata
-import uiinfo
-import re
-
-class READERCATA:
-
-   menu_defs=[
-              ('Catalogue',[
-                           ("Rapport de validation catalogue",'visuCRCATA'),
-                         ]
-              )
-             ]
-
-   button_defs=[]
-
-   def __init__(self,appli,parent):
-      self.appli=appli
-      self.parent=parent
-      self.code=self.appli.code
-      self.appli.format_fichier.set('python')
-      self.version_code=self.appli.version_code
-      self.fic_cata=None
-      self.OpenCata()
-      self.cataitem=None
-
-   def OpenCata(self):
-      """ 
-          Ouvre le catalogue standard du code courant, cad le catalogue présent
-          dans le répertoire Cata 
-      """
-      message1 = "Compilation des fichiers Eficas \n\n Veuillez patienter ..."
-      if self.appli.test == 0 :
-         splash._splash.configure(text = message1)
-      self.configure_barre(4)
-
-      liste_cata_possibles=[]
-      for catalogue in self.appli.CONFIGURATION.catalogues:
-          if catalogue[0] == self.code :
-             liste_cata_possibles.append(catalogue)
-
-      if len(liste_cata_possibles)==0:
-          showerror("Import du catalogue","Pas de catalogue defini pour le code %s" % self.code)
-          self.appli.quit()
-          sys.exit(1)
-
-      if self.version_code is not None:
-          # La version a ete fixee
-          for cata in liste_cata_possibles:
-             if self.version_code == cata[1]:
-                self.fic_cata = cata[2]
-                self.appli.format_fichier.set(cata[3])
-      elif len(liste_cata_possibles)==1:
-          self.fic_cata = liste_cata_possibles[0][2]
-          self.code = self.appli.CONFIGURATION.catalogues[0][0]
-          self.version_code = liste_cata_possibles[0][1]
-          self.appli.format_fichier.set(liste_cata_possibles[0][3])
-      else:
-          # plusieurs catalogues sont disponibles : il faut demander à l'utilisateur
-          # lequel il veut utiliser ...
-          self.ask_choix_catalogue()
-
-      if self.fic_cata == None :
-          print "Pas de catalogue pour code %s, version %s" %(self.code,self.version_code)
-          sys.exit(0)
-
-      # Determinination du repertoire materiau
-      v_codeSansPoint=self.version_code
-      v_codeSansPoint=re.sub("\.","",v_codeSansPoint)
-      chaine="rep_mat_"+v_codeSansPoint
-      if hasattr(self.appli.CONFIGURATION,chaine):
-          a=getattr(self.appli.CONFIGURATION,chaine)
-      else :
-          try :
-             a=self.appli.CONFIGURATION.dRepMat[self.version_code]
-          except :
-             print "Probleme avec le repertoire materiau"
-             a='.'
-      self.appli.CONFIGURATION.rep_mat=a 
-
-      # détermination de fic_cata_c et fic_cata_p
-      self.fic_cata_c = self.fic_cata + 'c'
-      self.fic_cata_p = os.path.splitext(self.fic_cata)[0]+'_pickled.py'
-
-      #if self.appli.test == 0 :
-      #   splash._splash.configure(text = "Debut compil cata: %d s" % time.clock())
-      # compilation éventuelle du catalogue
-      #test = self.compile_cata(self.fic_cata,self.fic_cata_c)
-      #self.update_barre()
-      #if self.appli.test == 0 :
-      #   splash._splash.configure(text = "Fin compil cata: %d s" % time.clock())
-      #if not test : showerror("Compilation catalogue","Impossible de compiler le catalogue %s" %self.fic_cata)
-
-      # import du catalogue
-      if self.appli.test == 0 :
-         splash._splash.configure(text = "Debut import_cata: %d s" % time.clock())
-      self.cata = self.import_cata(self.fic_cata)
-      self.update_barre()
-      if self.appli.test == 0 :
-         splash._splash.configure(text = "Fin import_cata: %d s" % time.clock())
-      if not self.cata : 
-          showerror("Import du catalogue","Impossible d'importer le catalogue %s" %self.fic_cata)
-          self.appli.quit()
-          sys.exit(1)
-      #
-      # analyse du catalogue (ordre des mots-clés)
-      #
-      if self.appli.test == 0 :
-         splash._splash.configure(text = "Debut Retrouve_Ordre: %d s" % time.clock())
-      # Retrouve_Ordre_Cata_Standard fait une analyse textuelle du catalogue
-      # remplacé par Retrouve_Ordre_Cata_Standard_autre qui utilise une numerotation
-      # des mots clés à la création
-      #self.Retrouve_Ordre_Cata_Standard()
-      self.Retrouve_Ordre_Cata_Standard_autre()
-      self.update_barre()
-      if self.appli.test == 0 :
-         splash._splash.configure(text = "Fin Retrouve_Ordre: %d s" % time.clock())
-      #
-      # analyse des données liées à l'IHM : UIinfo
-      #
-      uiinfo.traite_UIinfo(self.cata)
-      self.update_barre()
-
-      #
-      # traitement des clefs documentaires
-      #
-      self.traite_clefs_documentaires()
-
-      # chargement et analyse des catalogues développeur (le cas échéant)
-      #
-      if self.appli.CONFIGURATION.isdeveloppeur == 'OUI' :
-          init_rep_cata_dev(self.fic_cata,self.appli.CONFIGURATION.path_cata_dev)
-          fic_cata_dev = os.path.join(self.appli.CONFIGURATION.path_cata_dev,'cata_developpeur.py')
-          if os.path.isfile(fic_cata_dev):
-              # il y a bien un catalogue développeur : il faut récupérer le module_object associé ...
-              test = self.compile_cata(fic_cata_dev,fic_cata_dev+'c')
-              if not test :
-                  showinfo("Compilation catalogue développeur",
-                           "Erreur dans la compilation du catalogue développeur")
-                  self.cata = (self.cata,)
-              else:
-                  self.cata_dev =self.import_cata(fic_cata_dev)
-                  #self.Retrouve_Ordre_Cata_Developpeur()
-                  self.Retrouve_Ordre_Cata_Developpeur_autre()
-                  self.cata = (self.cata,self.cata_dev)
-          else:
-              self.cata = (self.cata,)
-      else:
-          self.cata = (self.cata,)
-      titreSuite=" avec le catalogue " + os.path.basename(self.fic_cata)
-      titre=self.appli.titre+titreSuite
-      if self.appli.top:
-        self.appli.top.title(titre)
-      self.appli.titre=titre
-
-       
-   def import_cata(self,cata):
-      """ 
-          Réalise l'import du catalogue dont le chemin d'accès est donné par cata
-      """
-      if self.appli.test == 0 :
-         splash._splash.configure(text = "Chargement du catalogue")
-      nom_cata = os.path.splitext(os.path.basename(cata))[0]
-      rep_cata = os.path.dirname(cata)
-      sys.path[:0] = [rep_cata]
-      try :
-          o=__import__(nom_cata)
-          return o
-      except Exception,e:
-          traceback.print_exc()
-          return 0
-
-   def Retrouve_Ordre_Cata_Standard_autre(self):
-      """ 
-          Construit une structure de données dans le catalogue qui permet
-          à EFICAS de retrouver l'ordre des mots-clés dans le texte du catalogue.
-          Pour chaque entité du catlogue on crée une liste de nom ordre_mc qui
-          contient le nom des mots clés dans le bon ordre
-      """ 
-      self.cata_ordonne_dico,self.appli.liste_simp_reel=autre_analyse_cata.analyse_catalogue(self.cata)
-
-   def Retrouve_Ordre_Cata_Standard(self):
-      """ 
-          Retrouve l'ordre des mots-clés dans le catalogue, cad :
-           - si ce dernier a été modifié, relance l'analyse du catalogue pour déterminer
-               l'ordre des mots-clés dans le catalogue
-           - s'il n'a pas été modifié, relie le fichier pickle 
-      """
-      time1 = os.path.getmtime(self.fic_cata)
-      try :
-          time2 = os.path.getmtime(self.fic_cata_p)
-      except:
-          time2 = 0
-      if time2 > time1 :
-          # l'objet catalogue n'a pas été modifié depuis le dernier "pickle"
-          self.Get_Ordre_Cata()
-      else :
-          # le catalogue a été modifié depuis le dernier "pickle" :
-          # il faut retrouver l'ordre du catalogue et refaire pickle
-          self.Get_Ordre_Cata(mode='cata')
-      self.appli.affiche_infos("Catalogue standard chargé")
-
-   def Retrouve_Ordre_Cata_Developpeur(self):
-      """ 
-          Retrouve l'ordre des mots-clés dans le catalogue, cad :
-          - si ce dernier a été modifié, relance l'analyse du catalogue pour déterminer
-            l'ordre des mots-clés dans le catalogue
-          - s'il n'a pas été modifié, relie le fichier pickle 
-      """
-      if self.code != 'ASTER' : return
-      fic_cata = os.path.join(self.appli.CONFIGURATION.path_cata_dev,'cata_developpeur.py')
-      message="Chargement catalogue développeur présent dans :\n %s..." % self.appli.CONFIGURATION.path_cata_dev
-      if self.appli.test == 0 :
-         splash._splash.configure(text = message,barre='oui')
-      cata_dev_ordonne = analyse_cata.analyse_catalogue(self,self.fic_cata)
-      self.cata_dev_ordonne_cr = cata_dev_ordonne.cr
-      cata_dev_ordonne_dico = cata_dev_ordonne.entites
-      self.cata_ordonne_dico.update(cata_dev_ordonne_dico)
-      self.appli.affiche_infos(" catalogue(s) développeur(s) chargé(s)" )
-
-   def Retrouve_Ordre_Cata_Developpeur_autre(self):
-      """
-          Retrouve l'ordre des mots-clés dans le catalogue, cad :
-          - si ce dernier a été modifié, relance l'analyse du catalogue pour déterminer
-            l'ordre des mots-clés dans le catalogue
-          - s'il n'a pas été modifié, relie le fichier pickle
-      """
-      if self.code != 'ASTER' : return
-      message="Chargement catalogue développeur présent dans :\n %s..." % self.appli.CONFIGURATION.path_cata_dev
-      if self.appli.test == 0 :
-         splash._splash.configure(text = message,barre='oui')
-      cata_dev_ordonne_dico,self.appli.liste_simp_reel=autre_analyse_cata.analyse_catalogue(self.cata)
-      self.cata_ordonne_dico.update(cata_dev_ordonne_dico)
-      self.appli.affiche_infos(" catalogue(s) développeur(s) chargé(s)" )
-
-   def Get_Ordre_Cata(self,mode='pickle'):
-      """ 
-          Retrouve l'ordre du catalogue :
-            - mode='pickle ': tente de relire le fichier pickle et sinon lance l'analyse du catalogue
-            - mode='cata'   : force l'analyse du catalogue directement sans relire le pickle
-      """
-      if mode == 'pickle' :
-          try:
-              f = open(self.fic_cata_p)
-              u = cPickle.Unpickler(f)
-              if self.appli.test == 0 :
-                 splash._splash.configure(text = "Analyse du catalogue")
-              self.cata_ordonne_dico = u.load()
-              f.close()
-          except :
-              # on peut ne pas arriver à relire le fichier pickle s'il a été altéré
-              # ou (le plus probable) s'il a été créé sous un autre OS
-              self.Get_Ordre_Cata(mode='cata')
-      elif mode == 'cata':
-          if self.appli.test == 0 :
-              splash._splash.configure(text = "Analyse du catalogue",barre='oui')
-          cata_ordonne = analyse_catalogue.analyse_catalogue(self,self.fic_cata)
-          self.cata_ordonne_cr = cata_ordonne.cr
-          self.cata_ordonne_dico = cata_ordonne.entites
-          splash._splash.configure(text = "Sauvegarde des informations sur le catalogue")
-          f = open(self.fic_cata_p,'w+')
-          p = cPickle.Pickler(f)
-          p.dump(self.cata_ordonne_dico)
-          f.close()
-      else :
-          raise Exception("Appel à un mode inconnu de Get_Ordre_Cata : %s" % mode)
-          return
-
-   def ask_choix_catalogue(self):
-      """
-      Ouvre une fenêtre de sélection du catalogue dans le cas où plusieurs
-      ont été définis dans Accas/editeur.ini
-      """
-      # construction du dictionnaire et de la liste des catalogues
-      self.dico_catalogues = {}
-      defaut = None
-      for catalogue in self.appli.CONFIGURATION.catalogues:
-          if catalogue[0] == self.code :
-              self.dico_catalogues[catalogue[1]] = catalogue
-              if len(catalogue) == 5 :
-                  if catalogue[4]=='defaut' : defaut = catalogue[1]
-      liste_choix = self.dico_catalogues.keys()
-      liste_choix.sort()
-      # test si plusieurs catalogues ou non
-      if len(liste_choix) == 0:
-          showerror("Aucun catalogue déclaré pour %s" %self.code)
-          self.appli.quit()
-          sys.exit(1)
-      elif len(liste_choix) == 1:
-          self.fic_cata = self.dico_catalogues[liste_choix[0]][2]
-          self.version_code = liste_choix[0]
-          return
-      # création d'une boîte de dialogue modale
-      self.fenetre_choix_cata = Pmw.Dialog(splash._splash, #avec self.parent, ne marche pas sous Windows
-                                           buttons=('OK','ANNULER'),
-                                           defaultbutton = 'OK',
-                                           title = "Choix d'une version du code %s" %self.code,
-                                           command = self.chooseCata)
-      # construction des radioboutons
-      label = `len(liste_choix)`+' versions du code %s sont disponibles\n' %self.code
-      label = label + 'Veuillez choisir celle avec laquelle vous souhaitez travailler :'
-      self.radiobutton = Pmw.RadioSelect(self.fenetre_choix_cata.interior(),
-                                         buttontype='radiobutton',
-                                         labelpos = 'w',
-                                         label_text = label,
-                                         label_font = fontes.standard,
-                                         orient='vertical')
-      for choix in liste_choix :
-          self.radiobutton.add(choix)
-      if defaut == None :
-          # aucun catalogue par défaut n'a été spécifié dans Accas/editeur.ini
-          defaut = liste_choix[0]
-      self.radiobutton.invoke(defaut)
-      self.radiobutton.pack(fill='x',padx=10,pady=10)
-      # centrage de la fenêtre
-      self.fenetre_choix_cata.activate(geometry='centerscreenalways')
-
-   def chooseCata(self,txt):
-      """ 
-          Méthode activée lorsque l'utilisateur a fait son choix et cliqué sur 'OK' ou sur 'ANNULER'
-      """
-      if txt == 'OK' :
-          version_cata = self.radiobutton.getcurselection()
-          self.fic_cata = self.dico_catalogues[version_cata][2]
-          self.version_code = version_cata
-          self.appli.format_fichier.set(self.dico_catalogues[version_cata][3])
-          self.fenetre_choix_cata.destroy()
-      else:
-          self.parent.destroy()
-
-   def compile_cata(self,cata,catac):
-      """ 
-           Teste si le catalogue a bien besoin d'être recompilé et si oui, le compile et
-           affiche un message dans le splash . Retourne 1 si la compilation s'est bien déroulée,
-           0 sinon.
-      """
-      time1 = os.path.getmtime(cata)
-      try:
-          time2 = os.path.getmtime(catac)
-      except:
-          time2 = 0
-      if time1 > time2:
-          try:
-              # le catalogue doit être recompilé avant d'être importé
-              if self.appli.test == 0 :
-                 splash._splash.configure(text="Compilation du catalogue\nCela peut prendre plusieurs secondes ...")
-              py_compile.compile(cata)
-          except:
-              return 0
-      return 1
-
-
-#--------------------------------------------------------------------------------
-# Méthodes concernant la barre de progression lors de l'analyse du catalogue
-#--------------------------------------------------------------------------------
-
-   def configure_barre(self,nbcommandes):
-      """ Configure la barre de progression en lui passant comme paramètre le
-          nombre de commandes du catalogue qui lui sert à déterminer la longueur de son incrément """
-      try:
-          if self.appli.test == 0 :
-             splash._splash.configure(barre='oui',ratio = nbcommandes)
-      except:
-          pass
-
-   def update_barre(self):
-      """ Update la position de la barre de progression : la fait progresser de son incrément """
-      try:
-          if self.appli.test == 0 :
-             splash._splash.update_barre()
-      except:
-          pass
-
-   def visuCRCATA(self):
-      """
-      Méthode permettant l'affichage du rapport de validation
-      """
-      cr = CR( debut = "Début rapport de validation du catalogue",
-               fin = "Fin rapport de validation du catalogue")
-      titre="rapport de validation du catalogue"
-      if hasattr(self,'cata_ordonne_cr') :
-          cr.add(self.cata_ordonne_cr)
-      if hasattr(self,'cata_dev_ordonne_cr') :
-          cr.add(self.cata_dev_ordonne_cr)
-      for cata in self.cata:
-          if hasattr(cata,'JdC'):
-              cr.add(cata.JdC.report())
-      texte_cr = str(cr)
-      self.visu_texte_cr = Fenetre(self.appli,titre=titre,texte=texte_cr)
-
-
-   def traite_clefs_documentaires(self):
-      try:
-        self.fic_cata_clef=os.path.splitext(self.fic_cata_c)[0]+'_clefs_docu'
-        f=open(self.fic_cata_clef)
-      except:
-        #print "Pas de fichier associé contenant des clefs documentaires"
-        return
-
-      dict_clef_docu={}
-      for l in f.readlines():
-          clef=l.split(':')[0]
-          docu=l.split(':')[1]
-          docu=docu[0:-1]
-          dict_clef_docu[clef]=docu
-      for oper in self.cata.JdC.commandes:
-           if dict_clef_docu.has_key(oper.nom):
-              oper.docu=dict_clef_docu[oper.nom]
index 421584a5a325dcc69569fcc5bb1edd2e2c6ec542..980af6cd0cebb010a02e42a58ed357a2e742c196 100644 (file)
@@ -46,8 +46,8 @@ except:
 
 import os,traceback
 import ConfigParser
-import prefs
 import re
+from Aster import prefs
 
 # Les valeurs decodees par optparse sont mises dans un objet dictionnaire-like.
 # On l'utilise comme environnement de session.
diff --git a/Editeur/shellpanel.py b/Editeur/shellpanel.py
deleted file mode 100644 (file)
index 0f92948..0000000
+++ /dev/null
@@ -1,96 +0,0 @@
-# -*- 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 Tkinter import *
-import Pmw
-from copy import copy,deepcopy
-import traceback
-
-# Modules Eficas
-import Objecttreeitem
-#import prefs
-#import panels
-#import images
-#from widgets import ListeChoix
-#from widgets import FenetreDeSelection
-
-from Noyau.N_CR import justify_text
-from utils import substract_list
-from newsimppanel import newSIMPPanel
-
-
-class SHELLPanel(newSIMPPanel):
-  """
-  Classe Panel utilisé pour les mots-clés simples qui attendent un shell pour valeur
-  """
-
-  def makeValeurPage(self,page):
-      """ 
-      Affiche la page concernant l'objet pointé par self qui attend un shell
-      """
-      objet_mc = self.node.item.get_definition()
-      aide = self.gen_aide()
-      aide = justify_text(texte=aide)
-      self.frame = Frame(page)
-      self.frame.place(relx=0,rely=0,relwidth=1,relheight=1)
-      label_aide = Label(self.frame,text = aide)
-      label_aide.place(relx=0.5,rely=0.1,anchor='center')
-      self.text = Text(self.frame,bg='gray95')
-      self.text.place(relx=0.2,rely=0.2,relwidth=0.6,relheight=0.6)
-      but_val = Button(self.frame,text='Valider',command = self.valide_shell)
-      but_ann = Button(self.frame,text='Annuler',command = self.annule_shell)
-      but_val.place(relx=0.35,rely=0.9,anchor='center')
-      but_ann.place(relx=0.65,rely=0.9,anchor='center')
-      self.display_valeur()
-
-  def gen_aide(self):
-      """
-      Retourne une chaîne de caractères d'aide sur la valeur qu'attend l'objet
-      pointé par self
-      """
-      return "Un shell est attendu"
-    
-  def valide_shell(self,event=None):
-      """
-      Récupère la valeur saisie par l'utilisateur dans self.text
-      et la stocke dans l'objet MCSIMP courant
-      """
-      texte = self.text.get(1.0,END)
-      self.record_valeur(texte)
-
-  def annule_shell(self,event=None):
-      """
-      Annule toute saisie dans self.text
-      """
-      self.text.delete(0,END)
-
-  def display_valeur(self,val=None):
-      """
-      Affiche la valeur de l'objet pointé par self
-      """
-      if val != None :
-          valeur = val
-      else:
-          valeur = self.node.item.get_valeur()
-      if valeur == None  or valeur == '': return
-      self.text.insert(END,valeur)
-
diff --git a/Editeur/splash.py b/Editeur/splash.py
deleted file mode 100644 (file)
index 2918ddf..0000000
+++ /dev/null
@@ -1,150 +0,0 @@
-# -*- 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 créer, mettre à jour et détruire
-    un écran Splash
-"""
-from Tkinter import *
-
-from centerwindow import centerwindow
-from Tools.foztools.foztools import Slider
-import fontes
-import images
-
-_splash=None
-
-def init_splash(*pos,**args):
-   global _splash
-   _splash=SplashScreen(*pos,**args)
-
-def fini_splash():
-   global _splash
-   _splash.quit()
-   _splash=None
-
-class SplashScreen(Toplevel):
-    """ 
-        Provides a splash screen. Usage:
-        Subclass and override 'CreateWidgets()'
-        In constructor of main window/application call
-           - S = SplashScreen(main=self)        (if caller is Toplevel)
-           - S = SplashScreen(main=self.master) (if caller is Frame)
-           - S.quit()  after you are done creating your widgets etc.
-    """
-    def __init__(self, master=None,**args):
-        Toplevel.__init__(self, master, relief='groove',
-                          borderwidth=5)
-        self.main = master
-        if self.main != None :
-            self.main.iconify()
-        self.withdraw()
-        self.frame = Frame(self)
-        self.frame.pack(expand=1,fill='both')
-        self.init(args)
-        self.geometry("300x200")
-        self.resizable(0,0)
-        centerwindow(self)
-        self.CreateWidgets()
-        self.deiconify()
-
-    def init(self,args={}):
-        self.text = StringVar()
-        self.text.set('')
-        self.text2 = StringVar()
-        self.text2.set('')
-        self.icone = 'logo_edf.gif'
-        self.barre = 'non'
-        if args == {} : return
-        if args.has_key('text'):
-            self.text.set(args['text'])
-        if args.has_key('info'):
-            self.text2.set(args['info'])
-        if args.has_key('titre'):
-            self.title(args['titre'])
-        if args.has_key('code'):
-            self.code = args['code']
-        else:
-            self.code = 'inconnu'
-        if args.has_key('icone'):
-            self.icone = args['icone']
-        if self.code == 'ASTER' :
-            self.icone = 'code_aster.gif'
-        elif self.code == 'SATURNE':
-            self.icone = 'code_saturne.gif'
-        elif self.code == 'DESCARTES':
-            self.icone = 'code_descartes.gif'
-
-    def CreateWidgets(self):
-        self.catIcon = images.get_image(self.icone)
-        self.label = Label(self.frame, image=self.catIcon)
-        self.label.pack(side=TOP)
-        self.label = Label(self.frame, textvariable=self.text,font = fontes.standard_gras)
-        self.label.pack(side=TOP,expand=1,fill='both')
-        self.label2 = Label(self.frame, textvariable=self.text2,font = fontes.standard_italique)
-        self.label2.pack(side=TOP,expand=1,fill='both')
-        self.progress = Slider(self.frame,value=0,max=100,orientation='horizontal',
-                               fillColor='#00008b',width=200,height=30,
-                               background='white',labelColor='red')
-        centerwindow(self)
-
-    def update_barre(self,event=None):
-        """ Permet de faire avancer la barre de progression """
-        try:
-            self.progress.value = self.progress.value+self.increment
-            self.progress.update()
-        except:
-            pass
-
-    def configure_barre(self):
-        """ 
-             Calcule l'incrément de progression de la barre en fonction
-             du nombre d'opérations à effectuer afin que le compteur
-             soit à 100% à la fin des opérations
-        """
-        self.increment = 100./self.ratio
-        self.progress.update()
-
-    def configure(self,**args):
-        if args.has_key('text'):
-            self.text.set(args['text'])
-        if args.has_key('info'):
-            self.text2.set(args['info'])
-        if args.has_key('titre'):
-            self.title(args['titre'])
-        if args.has_key('barre'):
-            old = self.barre
-            self.barre = args['barre']
-            if self.barre == 'oui' and old == 'non':
-                self.progress.frame.pack(in_=self.frame,side='top')
-            elif self.barre == 'non' and old == 'oui':
-                self.progress.frame.pack_forget()
-        if args.has_key('ratio'):
-            self.ratio = args['ratio']
-            self.configure_barre()
-        self.update()
-
-    def quit(self):
-        self.progress = None
-        self.destroy()
-        if self.main:
-           centerwindow(self.main,parent='sans')
-           self.main.deiconify()
-
diff --git a/Editeur/statusbar.py b/Editeur/statusbar.py
deleted file mode 100644 (file)
index e3b809b..0000000
+++ /dev/null
@@ -1,52 +0,0 @@
-# -*- 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 Tkinter
-import types
-
-class STATUSBAR:
-   def __init__(self,parent,police):
-      self.parent=parent
-      self.police=police
-      self.frame = Tkinter.Frame(parent,bd=1, relief=Tkinter.RAISED)
-      self.frame.pack(side=Tkinter.BOTTOM, fill=Tkinter.X)
-      self.label = Tkinter.Label (self.frame,
-                                        fg='black',
-                                        text='',
-                                        justify='left',
-                                        relief='sunken',
-                                        height=3,
-                                        bg='gray95')
-      self.label.pack(side='left',expand=1,fill='both')
-
-   def affiche_infos(self,texte):
-      if len(texte)>150 :
-          texte_infos=texte[0:150]
-      else :
-          texte_infos=texte
-      self.label.configure(text=texte_infos,font=self.police)
-
-   def reset_affichage_infos(self):
-      """ Efface tout message présent dans le panneau en bas d'EFICAS """
-      self.affiche_infos('')
-
diff --git a/Editeur/styles.py b/Editeur/styles.py
deleted file mode 100644 (file)
index dd90ee6..0000000
+++ /dev/null
@@ -1,19 +0,0 @@
-# -*- coding: utf-8 -*-
-import os
-import prefs
-import basestyle
-from basestyle import STYLE,style
-
-inistylefile=os.path.join(prefs.REPINI,"style.py")
-if os.path.isfile(inistylefile):
-   execfile(inistylefile)
-
-userstylefile=os.path.expanduser("~/Eficas_install/style.py")
-if os.path.isfile(userstylefile):
-   execfile(userstylefile)
-
-import fontes
-for attr in dir(style):
-   if attr[0]=='_':continue
-   if not hasattr(fontes,attr):continue
-   setattr(fontes,attr,getattr(style,attr))
diff --git a/Editeur/toolbar.py b/Editeur/toolbar.py
deleted file mode 100644 (file)
index 74248a0..0000000
+++ /dev/null
@@ -1,145 +0,0 @@
-# -*- 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
-from Tkinter import *
-import Pmw
-
-# Modules Eficas
-import images
-
-class TOOLBAR:
-  def __init__(self,appli,parent):
-      # parent représente l'objet graphique parent
-      self.parent=parent
-      # appli représente l'objet application parent
-      self.appli=appli
-      self.balloon = None
-      self.l_boutons_a_activer = []
-      self.barreboutons=Frame(self.parent,relief='ridge',bd=2)
-      self.barreboutons.pack(anchor='nw',expand=0,fill=X)
-      # bouton Infos à l'extrême droite de la barre des boutons
-      b = Button(self.barreboutons,
-                 image = images.get_image('About24'),
-                 command = self.view_infos)
-      b.pack(side='right')
-      texte = "Infos EFICAS"
-      b.bind("<Enter>",lambda e,s=self,but=b,t=texte : s.affiche_balloon(e,but,t,pos='right'))
-      b.bind("<Leave>", self.efface_balloon)
-
-  def appelle_commande(self,e,b,c):
-      try :
-         c()
-      except :
-         pass
-
-  def inactive_boutons(self):
-      """
-      Inactive les boutons de la liste self.l_boutons_a_activer
-      --> cette méthode est appelée dès qu'il n'y a pas de JDC courant
-      """
-      for but in self.l_boutons_a_activer:
-          but.configure(state='disabled')
-
-  def active_boutons(self):
-      """
-      Active les boutons de la liste self.l_boutons_a_activer
-      --> cette méthode est appelée dès qu'il y a un JDC courant
-      """
-      for but in self.l_boutons_a_activer:
-          but.configure(state='normal')
-
-  def affiche_balloon(self,event,bouton,bulle,pos='left'):
-      """
-      Affiche le balloon bulle associé au bouton bouton
-      """
-      etat = bouton.cget('state')
-      if etat != 'normal' : return
-      geom = bouton.winfo_geometry()
-      l_args = string.split(geom,'+')
-      x = eval(l_args[1])+event.x+10
-      self.balloon = Label(self.parent,
-                           text = bulle,
-                           background="yellow",
-                           borderwidth=2,
-                           relief='ridge')
-      if pos == 'left':
-          self.balloon.place(in_=self.parent,x=x,y=32)
-      else:
-          self.balloon.place(in_=self.parent,x=x,y=32,anchor='ne')
-
-  def efface_balloon(self,event=None):
-      """
-      Efface le balloon courant
-      """
-      if self.balloon :
-          self.balloon.destroy()
-          self.balloon = None
-
-  def view_infos(self):
-      """
-      Permet d'afficher des infos sur la session courante d'EFICAS
-      """
-      self.fen_infos = Pmw.Dialog(self.parent,
-                                  title = 'Informations session EFICAS',
-                                  buttons = ('Fermer',),
-                                  command = self.close_infos)
-      self.fen_infos.withdraw()
-      texte_infos = self.appli.get_texte_infos()
-      Label(self.fen_infos.interior(),
-            text = texte_infos,
-            anchor='center').pack(side='top',anchor='center')
-      self.fen_infos.activate(geometry = 'centerscreenalways')
-
-  def close_infos(self,lbl):
-      """
-      Ferme la fenêtre des infos
-      """
-      self.fen_infos.destroy()
-
-  def creer_boutons_appli_composant(self,l_boutons,appli_composant):
-      for bouton in l_boutons :
-          if not bouton :
-              # on veut afficher un bouton vide (=espace entre boutons)
-              Button(self.barreboutons,
-                     image = images.get_image('Sep'),
-                     state='disabled',
-                     relief = 'flat').pack(side='left')
-              continue
-          nom_fic,commande,texte,statut = bouton
-          commande=getattr(appli_composant,commande)
-          b = Button(self.barreboutons,
-                     image = images.get_image(nom_fic),
-                     command = commande,
-                     relief='flat')
-          b.pack(side='left')
-          b.bind("<Enter>",lambda e,s=self,but=b,t=texte : s.affiche_balloon(e,but,t))
-          b.bind("<Leave>", self.efface_balloon)
-          b.bind("<Return>", lambda e,s=self,but=b,c=commande:s.appelle_commande(e,but,c))
-          if statut != 'always':
-              self.l_boutons_a_activer.append(b)
-
-      # inactive les boutons qui doivent l'être tant qu'aucun JDC courant
-      self.inactive_boutons()
-
-
diff --git a/Editeur/tooltip.py b/Editeur/tooltip.py
deleted file mode 100644 (file)
index 18fbabb..0000000
+++ /dev/null
@@ -1,127 +0,0 @@
-# -*- 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 propose la classe TOOLTIP pour
-    mettre en oeuvre les bulles d'aide
-"""
-
-import Tkinter
-import types
-
-def destruct(obj):
-    # assist in breaking circular references
-    if obj is not None:
-        assert type(obj) is types.InstanceType
-        for k in obj.__dict__.keys():
-            obj.__dict__[k] = None
-            ##del obj.__dict__[k]
-
-def after(widget, ms, func, *args):
-    timer = apply(widget.after, (ms, func) + args)
-    command = widget._tclCommands[-1]
-    return (timer, command, widget)
-
-def after_cancel(t):
-    if t is not None:
-        t[2].after_cancel(t[0])
-        try:
-            t[2].deletecommand(t[1])
-        except Tkinter.TclError:
-            pass
-
-class TOOLTIP:
-    def __init__(self,widget,text=None):
-        self.widget=widget
-        self.text = text
-        self.timer = None
-        self.tooltip = None
-        self.label = None
-        self.bindings = []
-        self.bindings.append(self.widget.bind("<Enter>", self._enter))
-        self.bindings.append(self.widget.bind("<Leave>", self._leave))
-        self.bindings.append(self.widget.bind("<ButtonPress>", self._leave))
-        # user overrideable settings
-        self.time = 1000                    # milliseconds
-        self.relief = Tkinter.SOLID
-        self.justify = Tkinter.LEFT
-        self.fg = "#000000"
-        self.bg = "#ffffe0"
-        self.xoffset = 20
-        self.yoffset = 1
-
-    def setText(self, text):
-        self.text = text
-
-    def _unbind(self):
-        if self.bindings and self.widget:
-            self.widget.unbind("<Enter>", self.bindings[0])
-            self.widget.unbind("<Leave>", self.bindings[1])
-            self.widget.unbind("<ButtonPress>", self.bindings[2])
-            self.bindings = []
-
-    def destroy(self):
-        self._unbind()
-        self._leave()
-
-    def _enter(self, *event):
-        after_cancel(self.timer)
-        self.timer = after(self.widget, self.time, self._showTip)
-
-    def _leave(self, *event):
-        after_cancel(self.timer)
-        self.timer = None
-        if self.tooltip:
-            self.label.destroy()
-            destruct(self.label)
-            self.label = None
-            self.tooltip.destroy()
-            destruct(self.tooltip)
-            self.tooltip = None
-
-    def _showTip(self):
-        if self.tooltip or not self.text:
-            return
-        c = self.widget.__class__
-        if c in (Tkinter.Button,):
-            if self.widget["state"] == Tkinter.DISABLED:
-                return
-        x = self.widget.winfo_rootx()
-        y = self.widget.winfo_rooty() + self.widget.winfo_height()
-        x = x + self.xoffset
-        y = y + self.yoffset
-        self.tooltip = Tkinter.Toplevel()
-        self.tooltip.wm_iconify()
-        self.tooltip.wm_overrideredirect(1)
-        self.tooltip.wm_protocol("WM_DELETE_WINDOW", self.destroy)
-        self.label = Tkinter.Label(self.tooltip, text=self.text,
-                         relief=self.relief, justify=self.justify,
-                         fg=self.fg, bg=self.bg, bd=1, takefocus=0)
-        self.label.pack(ipadx=1, ipady=1)
-        self.tooltip.wm_geometry("%+d%+d" % (x, y))
-        self.tooltip.wm_deiconify()
-
-if __name__ == "__main__":
-   root=Tkinter.Tk()
-   label = Tkinter.Label(root, text="coucou")
-   label.pack()
-   tp=TOOLTIP(label,"texte d'aide")
-   root.mainloop()
-
diff --git a/Editeur/treeitemincanvas.py b/Editeur/treeitemincanvas.py
deleted file mode 100644 (file)
index f007f45..0000000
+++ /dev/null
@@ -1,72 +0,0 @@
-# -*- 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 Tkinter,Pmw
-
-# Modules Eficas
-import Objecttreeitem
-import treewidget
-
-class TREEITEMINCANVAS:
-   def __init__(self,object,nom="",parent=None,appli=None,sel=None,rmenu=None):
-      self.object=object
-      self.nom=nom
-
-      if not appli:
-         class Appli:
-            def affiche_infos(self,message):
-               pass
-         appli=Appli()
-      self.appli=appli
-
-      if not parent:
-         parent=Tkinter.Tk()
-         Pmw.initialise(parent)
-      self.parent=parent
-
-      self.item=Objecttreeitem.make_objecttreeitem(self.appli,self.nom,self.object)
-      self.canvas=Pmw.ScrolledCanvas(self.parent,borderframe=1,canvas_background='gray95')
-      self.canvas.pack(padx=10,pady=10,fill = 'both', expand = 1)
-      if not sel:
-         def sel(event=None):
-            return
-      self.tree=treewidget.Tree(self.appli,self.item,self.canvas,command=sel,rmenu=rmenu)
-      self.tree.draw()
-
-   def mainloop(self):
-      self.parent.mainloop()
-
-   def update(self):
-      """Cette methode est utilisee pour signaler une mise a jour des objets associes"""
-      self.tree.update()
-
-   def supprime(self):
-      #print "supprime",self
-      self.tree.supprime()
-      self.tree=None
-      self.canvas.destroy()
-      self.canvas=None
-
-   #def __del__(self):
-   #   print "__del__",self
-
diff --git a/Editeur/treewidget.py b/Editeur/treewidget.py
deleted file mode 100644 (file)
index a0c3be1..0000000
+++ /dev/null
@@ -1,945 +0,0 @@
-# -*- 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 os,sys,string,re,types,traceback
-from Tkinter import *
-
-
-import fontes
-import images
-from Ihm import CONNECTOR
-
-#
-__version__="$Name:  $"
-__Id__="$Id: treewidget.py,v 1.31.12.1 2007-04-26 07:56:07 cchris Exp $"
-#
-
-Fonte_Standard = fontes.standard
-
-class Tree :
-    def __init__(self,appli,jdc_item,scrolledcanvas,command = None,rmenu=None):
-        self.item = jdc_item
-        self.scrolledcanvas = scrolledcanvas
-        self.canvas = self.scrolledcanvas.component('canvas')
-        #resolution
-        resolution= self.canvas.winfo_screenwidth()/(self.canvas.winfo_screenmmwidth()/25.4*72)
-        self.DDY=max(20,resolution*(Fonte_Standard[1]+4))
-        self.id_up=self.canvas.bind("<F11>", self.page_up)
-        self.id_down=self.canvas.bind("<F12>", self.page_down)
-        self.id_um=self.canvas.bind("<Key-Left>", self.mot_up)
-        self.id_dm=self.canvas.bind("<Key-Right>", self.mot_down)
-        self.id_s=self.canvas.bind("<1>", self.canvas_select)             
-        self.tree = self
-        self.command = command
-        self.rmenu=rmenu
-        self.appli = appli
-        self.parent = None
-        self.racine = self
-        self.node_selected = None
-        self.build_children()
-
-    def canvas_select(self,event):
-        self.canvas.focus_set()
-
-    def page_up(self,event):
-        event.widget.yview_scroll(-1, "page")
-
-    def page_down(self,event):
-        event.widget.yview_scroll(1, "page")
-   
-    def unit_up(self,event):
-        event.widget.yview_scroll(-1, "unit")
-
-    def unit_down(self,event):
-        event.widget.yview_scroll(1, "unit")              
-
-    def mot_down(self,event):
-        self.select_next(None)
-        self.canvas.focus_set()
-
-    def mot_down_force(self):
-        self.select_next(None)
-        self.canvas.focus_set()
-
-    def mot_up(self,event):
-        self.node_selected.select_mot_previous()
-        self.canvas.focus_set()
-
-    def mot_up_force(self):
-        self.node_selected.select_mot_prev()
-        self.canvas.focus_set()
-
-    def deplieReplieNode(self):
-        self.node_selected.deplieReplieNode()
-
-    def build_children(self):
-        """ Construit la liste des enfants de self """
-        self.children = []
-        child = self.item.itemNode(self,self.item,self.command,self.rmenu)
-        self.children.append(child)
-        child.state='expanded'
-
-    def draw(self):
-        """ Dessine l'arbre """
-        lasty = 8
-        x = 5
-        for child in self.children:
-            child.draw(x,lasty)
-            lasty = child.lasty + 15
-        self.children[0].select()
-        self.resizescrollregion()
-
-    def deselectall(self):
-        """ déselectionne tous les éléments de l'arbre """
-        if self.node_selected :
-            self.node_selected.deselect()
-            
-    def update(self):
-        """ Update tous les éléments de l'arbre """
-        for child in self.children:
-            child.update()
-
-    def supprime(self):
-        """ supprime tous les éléments de l'arbre """
-        #print "supprime",self
-        self.canvas.unbind("<F11>",self.id_up)
-        self.canvas.unbind("<F12>",self.id_down)
-        self.canvas.unbind("<Key-Left>",self.id_um)
-        self.canvas.unbind("<Key-Right>",self.id_dm)
-        self.canvas.unbind("<1>",self.id_s)             
-        self.tree = None
-        self.racine = None
-        self.node_selected = None
-        self.item = None
-        self.scrolledcanvas = None
-        self.canvas = None
-        self.command = None
-        self.rmenu=None
-        for child in self.children:
-            child.supprime()
-        self.children=[]
-
-    def update_valid(self) :
-        """Cette methode a pour but de mettre a jour la validite du noeud
-           et de propager la demande de mise à jour à son parent
-        """
-        pass
-
-    def resizescrollregion(self):
-        x0,y0,x1,y1=self.canvas.bbox(ALL)
-        # On ajoute une marge approximativement de la moitié du canvas
-        y1=y1+self.canvas.winfo_height()/2
-        self.canvas.configure(scrollregion = (x0,y0,x1,y1))
-
-    def select_next(self,event):
-        self.node_selected.select_next()
-        self.canvas.focus_set()
-
-    def select_previous(self,event):
-        self.node_selected.select_previous()
-
-    def see(self,items):
-        x1, y1, x2, y2=apply(self.canvas.bbox, items)
-        while x2 > self.canvas.canvasx(0)+self.canvas.winfo_width():
-            old=self.canvas.canvasx(0)
-            self.canvas.xview_scroll( 1, 'units')
-            # avoid endless loop if we can't scroll
-            if old == self.canvas.canvasx(0):
-                break
-        while y2 > self.canvas.canvasy(0)+self.canvas.winfo_height():
-            old=self.canvas.canvasy(0)
-            self.canvas.yview_scroll( 1, 'units')
-            if old == self.canvas.canvasy(0):
-                break
-        # done in this order to ensure upper-left of object is visible
-        while x1 < self.canvas.canvasx(0):
-            old=self.canvas.canvasx(0)
-            self.canvas.xview_scroll( -1, 'units')
-            if old == self.canvas.canvasx(0):
-                break
-        while y1 < self.canvas.canvasy(0):
-            old=self.canvas.canvasy(0)
-            self.canvas.yview_scroll( -1, 'units')
-            if old == self.canvas.canvasy(0):
-                break
-
-    #def __del__(self):
-    #   print "__del__",self
-
-class Node :
-    def __init__(self,parent,item,command=None,rmenu=None):
-        self.parent = parent
-        self.item = item
-        self.connect()
-        self.command = command
-        self.rmenu=rmenu
-        self.tree = self.parent.tree
-        self.appli = self.parent.appli
-        self.canvas = self.parent.canvas
-        self.init()
-
-    def init(self):
-        self.state='collapsed'
-        self.displayed = 0
-        self.selected = 0
-        self.x = self.y  =None
-        self.lasty = 0
-        self.children = None
-        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 __del__(self):
-    #    print "__del__",self
-
-    def force_select(self):
-        if self.selected:
-           # le noeud est selectionné. On force la reconstruction du panel associé
-           if self.command:apply(self.command,(None,))
-           self.select()
-
-    def onValid(self):
-        #print "onValid : l'item a changé de validité ",self.item,self.item.object,self.item.object.isvalid()
-        self.update_node_valid()
-        self.update_node_label()
-        self.update_node_texte()
-        if self.selected and self.command:
-           self.command(self)
-
-    def onAdd(self,objet):
-        #print "onAdd : un objet a été ajouté aux fils de l'item ",self.item.object,objet
-        self.expand_node()
-        old_nodes=self.children
-        self.update_nodes()
-        self.redraw_children(old_nodes)
-        self.force_select()
-
-    def onSupp(self,objet):
-        #print "onSupp : un objet a été supprimé des fils de l'item ",self.item.object,objet
-        self.expand_node()
-        old_nodes=self.children
-        self.update_nodes()
-        self.redraw_children(old_nodes)
-        self.force_select()
-
-    def update_nodes(self):
-        #print "update_nodes",self
-        newnodes=[]
-        inodes=iter(self.children)
-        sublist=self.item._GetSubList()
-        iliste=iter(sublist)
-
-        while(1):
-           old_item=item=None
-           for node in inodes:
-              old_item=node.item
-              if old_item in sublist:break
-              #print "item supprime",old_item
-           for item in iliste:
-              if item is old_item:break
-              #print "item ajoute",item
-              child = item.itemNode(self,item,self.command,self.rmenu)
-              newnodes.append(child)
-
-           if old_item is None and item is None:break
-           if old_item is item:
-              #print "item conserve",item
-              newnodes.append(node)
-
-        self.children=newnodes
-        self.connect()
-
-    def supprime(self):
-        #print "supprime",self
-        self.efface_node()
-        self.racine = None
-        self.command = None
-        self.rmenu=None
-        if not self.children : return
-        for child in self.children:
-            child.supprime()
-        self.children=None
-
-    def redraw_children(self,old_nodes):
-        #print "redraw_children",old_nodes
-        #print self.children
-        y = self.y + self.tree.DDY
-        x = self.x + 15
-        supp_nodes=[]
-
-        inodes=iter(old_nodes)
-        iliste=iter(self.children)
-        # on parcourt la liste des anciens noeuds (node)
-        # et la liste des nouveaux noeuds (new_node) en parallele (iterateurs)
-
-        while(1):
-           new_node=node=None
-           for node in inodes:
-              #print "ancien noeud",node
-              if node in self.children:break # ancien noeud toujours present
-              #print "noeud supprime",node,node.item.GetLabelText()[0]
-              dy=node.y-node.lasty -self.tree.DDY
-              #print "deplacer noeuds",y,dy
-              node.move_nodes(y,dy)
-              node.supprime()
-              #supp_nodes.append(node)
-
-           for new_node in iliste:
-              #print "nouveau noeud",new_node
-              if new_node in old_nodes: break # nouveau noeud deja present
-              #print "noeud ajoute",new_node,new_node.item.GetLabelText()[0]
-              y=self.draw_node(new_node,x,y)
-
-           if node is None and new_node is None : break
-
-           if node is new_node: # ancien noeud
-              #print "noeud conserve",node
-              node.update_node_label()
-              y=y+node.lasty-node.y +self.tree.DDY
-
-        self.racine.update_coords()
-        self.canvas.delete('line')
-        self.racine.trace_ligne()
-        self.tree.resizescrollregion()
-        # Mettre à 1 pour verifier les cycles entre objets node
-        #withCyclops=0
-        #if withCyclops:
-           #from Misc import Cyclops
-           #z = Cyclops.CycleFinder()
-           #print supp_nodes
-           #for o in supp_nodes:
-             #z.register(o)
-           #del supp_nodes
-           #del o
-           #z.find_cycles()
-           #z.show_stats()
-           #z.show_cycles()
-
-    def tag_move_nodes(self,y):
-        """ Marque pour deplacement tous les noeuds au dela de l'ordonnée y """
-        #print "tag_move_nodes",y
-        self.canvas.dtag(ALL,'move')
-        # on marque tous les ids au dela de y
-        x0, y0, x1, y1 = self.canvas.bbox(ALL)
-        if y > y1: # pas d'objet a deplacer
-           return
-        self.canvas.addtag_overlapping('move',x0,y,x1,y1)
-
-    def move_nodes(self,y,dy):
-        """ Déplace de l'incrément dy les noeuds au dela de l'ordonnée y """
-        #print "move_nodes",y,dy
-        self.tag_move_nodes(y)
-        # on déplace tous les items de dy
-        self.canvas.move('move',0,dy)
-
-    def draw_node(self,new_node,x,y):
-        """ Dessine le noeud new_node en x,y en deplacant les noeuds existants
-            en y et au dela
-            Retourne la position du premier des noeuds deplaces
-        """
-        #print "draw_node",new_node,x,y
-        self.tag_move_nodes(y)
-        #if new_node.item.isactif():
-           #new_node.state = 'expanded'
-        new_node.state = 'expanded'
-        new_node.draw(x,y)
-        dy=(new_node.get_nb_children()+1)*self.tree.DDY
-        #print "deplacer noeuds",y,dy
-        self.canvas.move('move',0,dy)
-        return new_node.lasty+self.tree.DDY
-
-    def build_children(self):
-        """ Construit la liste des enfants de self """
-        self.children = []
-        sublist = self.item._GetSubList()
-        if not sublist : return
-        for item in sublist :
-            child = item.itemNode(self,item,self.command,self.rmenu)
-            self.children.append(child)
-            
-    #-----------------------------------------------
-    # Méthodes de sélection/déselection d'un noeud
-    #-----------------------------------------------
-    
-    def select(self, event=None):
-        """
-        Rend le noeud courant (self) sélectionné et déselectionne
-        tous les autres
-        """
-        #print "SELECT",self
-        if not self.children : self.build_children()
-        self.tree.deselectall()
-        self.selected = 1
-        self.tree.node_selected = self
-        if self.command:apply(self.command,(self,))
-        self.highlight()
-        self.make_visible()
-
-    def deselect(self, event=None):
-        """ Déselectionne self """
-        self.selected = 0
-        if self.displayed == 1 : self.dehighlight()
-            
-    def make_visible(self):
-        """ Rend l'objet self visible cad déplace le scroll pour que self 
-            soit dans la fenêtre de visu
-        """
-        lchild=self.last_child()
-        self.tree.see((self.image_id,lchild.image_id))
-        
-    def select_next(self,ind=0):
-        """ on doit chercher à sélectionner dans l'ordre:
-            - son premier fils s'il est affiché
-            - son frère cadet s'il existe
-            - son oncle (benjamin de son père)
-            - ... appel récursif ...
-        """
-        if self.state=='expanded' and len(self.children) > ind:
-            self.children[ind].select()
-        else :
-            index = self.parent.children.index(self) + 1
-            try :
-              if isinstance(self.parent,TREE) :
-                try:
-                    self.children[ind].select()
-                except:
-                    self.children[0].select()
-            except :
-              if self.parent is self.tree:
-                pass
-              else :
-                self.parent.select_next(index)
-
-    def select_mot_prev(self):
-        index = self.parent.children.index(self) - 1
-        try :
-           if index > -1  :
-              self.parent.children[index].select()
-              if self.parent.children[index].state=="expanded":
-                 print len(self.parent.children[index].children)
-                 if len(self.parent.children[index].children)!=0 :
-                    max=len(self.parent.children[index].children) - 1
-                    self.parent.children[index].children[max].select()
-                 else :
-                    self.parent.children[index].select()
-              else :
-                 self.parent.children[index].select()
-           elif self.parent is self.tree:
-              pass
-           else :
-              self.parent.select()
-        except:
-            if self.parent is self.tree:
-               pass
-            else :
-               self.parent.select_previous()
-
-        
-    def select_mot_previous(self):
-        index = self.parent.children.index(self) - 1
-        try :
-            if index > -1  :
-               self.parent.children[index].select()
-            elif self.parent is self.tree:
-               pass
-            else :
-               self.parent.select()
-        except:
-            if self.parent is self.tree:
-               pass
-            else :
-               self.parent.select_previous()
-
-    def select_previous(self):
-        """ on doit d'abord sélectionner(dans l'ordre) :
-             - son frère aîné
-             - son père
-        """
-        index = self.parent.children.index(self) - 1
-        try :
-            self.parent.children[index].select()
-        except:
-            #self.parent.select()
-            if self.parent is self.tree:
-               pass
-            else :
-               self.parent.select_previous()
-
-    def popup(self,event=None):
-        """
-            Declenche le traitement associé au clic droit de la souris
-            sur l'icone du Node
-        """
-        if not self.rmenu:return
-        apply(self.rmenu,(self,event))
-
-    #-----------------------------------------------
-    # Méthodes de recherche d'informations
-    #-----------------------------------------------
-    def geticonimage(self,name=None):
-        """
-        Retourne l'image qui doit être associée à self
-        """
-        if not name :
-            name = self.item.GetIconName()
-        if not name or name == 'aucune' :
-            return None
-        return images.get_image(name)
-
-    def get_nb_children(self):
-        """ Retourne le nombre d'enfants affichés de self """
-        nb = 0
-        if self.state =='collapsed' :  return nb
-        for child in self.children :
-            nb = nb + 1 + child.get_nb_children()
-        return nb
-
-    def get_liste_id(self):
-        """ Retourne la liste de tous les id (filiation comprise) de self """
-        liste = self.id
-        for child in self.children:
-            liste.extend(child.get_liste_id())
-        return liste
-
-    def get_node_fils(self,name) :
-        """ Retourne le fils de self de nom name s'il existe"""
-        for child in self.children:
-            if child.item.get_nom() == name: return child
-        return None
-
-    #-----------------------------------------------
-    # Méthodes d'affichage d'un noeud
-    #-----------------------------------------------
-    def draw(self,x,y):
-        """ Permet de tracer le noeud self """
-        # le début du noeud est en x,y
-        self.x = x
-        self.y = y
-        self.lasty = y
-        self.displayed = 1
-        self.id=[]
-        # choix de l'icone à afficher : + ou -
-        if self.item.IsExpandable():
-            if self.state == 'expanded':
-                iconname = "minusnode"
-                callback = self.collapse
-            else:
-                iconname = "plusnode"
-                callback = self.expand
-            image = self.geticonimage(name=iconname)
-            self.icone_id = self.canvas.create_image(self.x, self.y, image=image)
-            self.callback_id=self.canvas.tag_bind(self.icone_id, "<1>", callback)
-            self.id.append(self.icone_id)
-        # création de la ligne horizontale
-        self.ligne_id = self.canvas.create_line(self.x,self.y,self.x+10,self.y)
-        self.id.append(self.ligne_id)
-        self.canvas.tag_lower(self.ligne_id)
-        # affichage de l'icone (carre ,rond, ovale ...) de couleur
-        image = self.geticonimage()
-        if image != None :
-            self.image_id = self.canvas.create_image(self.x+15,self.y,image = image)
-            self.select_id2=self.canvas.tag_bind(self.image_id,"<1>",self.select)
-            self.popup_id2=self.canvas.tag_bind(self.image_id,"<3>",self.popup)
-            self.id.append(self.image_id)
-        else:
-            self.image_id = None
-        # affichage du texte : nom de l'objet (ETAPE ou MOT-CLE) et sa valeur
-        self.drawtext()
-        if self.state == 'expanded' :
-            if not self.children : self.build_children()
-            if len(self.children) > 0:
-                self.drawchildren()
-                self.lasty = self.children[-1].lasty
-   
-    def drawchildren(self):
-        """ Dessine les enfants de self """
-        y = self.y + self.tree.DDY
-        x = self.x + 15
-        for child in self.children:
-            child.draw(x,y)
-            nb = child.get_nb_children()
-            y = y + self.tree.DDY*(nb+1)
-        self.trace_ligne()
-
-    def drawtext(self):
-        """ Affiche les deux zones de texte après l'icône de couleur de l'objet """
-        if self.image_id != None :
-            textx = self.x + 30
-        else:
-            textx = self.x + 15
-        texty = self.y
-        # nom,fonte et couleur de l'objet du noeud à afficher
-        labeltext,fonte,couleur = self.item.GetLabelText()
-        if labeltext    == ''   : labeltext = '   '
-        if fonte        == None : fonte = Fonte_Standard
-        if couleur      == None : couleur = 'black'
-        # création du widget label
-        self.label = Label(self.canvas,
-                           text = labeltext,
-                           fg = couleur,
-                           bg = 'gray95',
-                           font=fonte)
-        self.label_id = self.canvas.create_window(textx,texty,window=self.label,anchor='w')
-        self.id.append(self.label_id)
-        # bindings sur le widget label
-        self.select_id=self.label.bind("<1>", self.select)
-        self.popup_id=self.label.bind("<3>", self.popup)
-        self.enter_id=self.label.bind("<Enter>",self.enter)
-        self.leave_id=self.label.bind("<Leave>",self.leave)
-        # valeur de cet objet à afficher
-        x0, y0, x1, y1 = self.canvas.bbox(self.label_id)
-        textx = max(x1, 200) + 10
-        text = self.item.GetText() or " "
-        self.text = Label(self.canvas, text=text,
-                            bd=0, padx=2, pady=2,background='gray95',
-                            font=fonte)
-        if self.selected:
-            self.highlight()
-        else:
-            self.dehighlight()
-        self.text_id = self.canvas.create_window(textx, texty,anchor="w", window=self.text)
-        self.id.append(self.text_id)
-        
-    def highlight(self,event=None):
-        """ Met en surbrillance self"""
-        if hasattr(self,'label'):
-            self.label.configure(fg='white',bg='#00008b')
-        if (hasattr(self.item,'get_nom') and hasattr( self.appli, 'salome')) :
-            if self.item.get_nom() == "AFFE_CARA_ELEM":
-               self.item.rmenu_specs=[("View3D", "visu_3D")]
-               self.tree.rmenu
-              
-            
-    def dehighlight(self,event=None):
-        """ Rétablit l'affichage normal de self"""
-        if hasattr(self,'label'):
-            self.label.configure(fg='black',bg='gray95')
-
-    def enter(self,event=None):
-        """ Met en surbrillance self et affiche le fr de l'objet """
-        self.highlight()
-        fr = self.item.get_fr()
-        self.appli.affiche_infos(fr)
-        
-    def leave(self,event=None):
-        """ Rétablit l'affichage normal de self et efface le fr de l'objet """
-        if not self.selected :
-            self.dehighlight()
-        self.appli.affiche_infos('')
-
-    def collapse_children(self):
-        """ Collapse récursivement tous les descendants de self """
-        if not self.children : return
-        for child in self.children:
-            child.state='collapsed'
-            child.collapse_children()
-
-    def deplieReplieNode(self):           
-        if self.state == 'expanded':
-           self.collapse()
-        else :
-           self.expand_node()
-
-    def collapse(self,event = None):
-        """ Collapse self et descendants et retrace self """
-        nb = self.get_nb_children()
-        self.state = 'collapsed'
-        self.collapse_children()
-        self.redraw(-nb)
-        self.select()
-   
-    def expand_node(self,event = None):
-        """ Expanse self et le retrace """
-        if self.state == 'expanded':return
-        #if not self.item.isactif() : return
-        if not self.children : self.build_children()
-        self.state = 'expanded'
-        nb = self.get_nb_children()
-        self.redraw(nb)
-
-    def expand(self,event = None):
-        """ Expanse self et le retrace """
-        self.expand_node()
-        self.select()
-
-    def redraw(self,nb):
-        """ Redessine self :  nb est le décalage à introduire
-            en dessous de self pour le redessiner """
-        # nb = nombre d'items de décalage
-        self.move(self.tree.DDY*nb)
-        # on efface self et on le redessine
-        self.efface()
-        self.draw(self.x,self.y)
-        # Il n'est pas nécessaire d'appeler update
-        # il suffit d'updater les coordonnees et de retracer les lignes
-        self.racine.update_coords()
-        self.racine.trace_ligne()
-        self.update_valid()
-        self.tree.resizescrollregion()
-        
-    def update_coords(self):
-        """ Permet d'updater les coordonnes de self et de tous ses enfants"""
-        if self.displayed == 0 : return
-        if self.image_id != None :
-            coords = self.canvas.coords(self.image_id)
-            self.x = coords[0]-15
-        else:
-            coords = self.canvas.coords(self.label_id)
-            self.x = coords[0]-15
-        self.y = coords[1]
-        self.lasty = self.y
-        if self.state == 'expanded' :
-            for child in self.children:
-                if child.displayed != 0:
-                    child.update_coords()
-                    self.lasty = child.lasty
-
-    def update_icone(self):
-        """ Met à jour les icônes de tous les noeuds : teste la validité de l'objet
-        Cette méthode est très lente, trop !!"""
-        if self.image_id != None :
-            image = self.geticonimage()
-            self.canvas.itemconfig(self.image_id,image=image)
-        if self.state == 'expanded':
-            for child in self.children:
-                if child.displayed != 0:
-                    child.update_icone()
-
-    def update_label_texte(self):
-        """ Met a jour le label du noeud et celui de tous ses fils ouverts """
-        self.update_node_label()
-        if self.state == 'expanded' :
-            for child in self.children:
-                if child.displayed != 0 : child.update_label_texte()
-
-    def update_texte(self):
-        """ Met à jour les noms des SD et valeurs des mots-clés """
-        self.update_node_texte()
-        if self.state == 'expanded' :
-            for child in self.children:
-                if child.displayed != 0 : child.update_texte()
-        
-    def update_node_label(self):
-        """ Met a jour le label du noeud """
-        if self.displayed == 0 : return
-        # nom,fonte et couleur de l'objet du noeud à afficher
-        labeltext,fonte,couleur = self.item.GetLabelText()
-        if labeltext    == ''   : labeltext = '   '
-        if fonte        == None : fonte = Fonte_Standard
-        if couleur      == None : couleur = 'black'
-        self.label.configure(text=labeltext,font=fonte)
-
-    def update_node_texte(self):
-        """ Met à jour les noms des SD et valeurs des mots-clés """
-        if self.displayed == 0 : return
-        text = self.item.GetText()
-        if text == None : text = ''
-        self.text.configure(text=text)
-
-    def update_node_valid(self) :
-        """Cette methode remet a jour la validite du noeud (icone)
-           Elle appelle isvalid
-        """
-        if self.displayed == 0 : return
-        if self.image_id != None :
-            image = self.geticonimage()
-            self.canvas.itemconfig(self.image_id,image=image)
-
-    def update_valid(self) :
-        """Cette methode a pour but de mettre a jour la validite du noeud
-           et de propager la demande de mise à jour à son parent
-        """
-        self.update_node_valid()
-        self.parent.update_valid()
-
-    def update(self,event=None) :
-        """ Classe Node :
-            Cette méthode est appelée pour demander l update d un noeud 
-            d'un jeu de commandes
-            Cette demande est transmise au noeud racine (le JDC) qui update
-            tout l arbre représentant le jeu de commandes
-            Pendant cette mise à jour, on appelle la méthode isvalid qui
-            fera l update de tous les objets déclarés modifiés lors des
-            actions précédentes
-            La métode isvalid est en général appelée par l intermédiaire de
-            update_icone -> geticonimage -> GetIconName
-        """
-        #print "update",self
-        #traceback.print_stack()
-        self.racine.update_coords()
-        self.racine.trace_ligne()
-        self.racine.update_icone()
-        self.racine.update_texte()
-        self.racine.update_label_texte()
-        self.tree.resizescrollregion()
-
-    def efface_node(self):
-        if self.displayed != 0:
-           self.label.unbind("<1>", self.select_id)
-           self.label.unbind("<3>", self.popup_id)
-           self.label.unbind("<Enter>",self.enter_id)
-           self.label.unbind("<Leave>",self.leave_id)
-           self.canvas.tag_unbind(self.image_id,"<1>",self.select_id2)
-           self.canvas.tag_unbind(self.image_id,"<3>",self.popup_id2)
-           if self.item.IsExpandable():
-              self.canvas.tag_unbind(self.icone_id, "<1>", self.callback_id)
-           self.label.destroy()
-           self.text.destroy()
-
-        for id in self.id :
-            self.canvas.delete(id)
-        self.id=[]
-        self.label_id=None
-        self.text_id=None
-        self.image_id=None
-        self.icone_id=None
-        self.label=None
-        self.text=None
-        self.displayed=0
-
-    def efface(self):
-        """ Efface du canvas les id associés à self : cad les siens et ceux
-            de ses enfants """
-        self.efface_node()
-        if not self.children : return
-        for child in self.children:
-            child.efface()
-
-    def move(self,dy):
-        """ Déplace de l'incrément dy tous les id en dessous de self """
-        # il faut marquer tous les suivants de self
-        bbox1 = self.canvas.bbox(ALL)
-        self.canvas.dtag(ALL,'move')
-        self.canvas.delete('line')
-        try:
-            self.canvas.addtag_overlapping('move',bbox1[0],self.y +10,bbox1[2],bbox1[3])
-        except:
-            print "Erreur dans move :"
-            print self
-            print self.item
-            print self.item.getObject()
-            print self.item.getObject().definition.label
-            print 'y=',self.y
-            print 'dy=',dy
-        # on déplace tous les items de dy
-        self.canvas.move('move',0,dy)
-
-    def trace_ligne(self):
-        """ Dessine les lignes verticales entre frères et entre père et premier fils"""
-        if self.state=='collapsed' : return
-        if len(self.children)==0 : return
-        # on est bien dans le cas d'un noeud expansé avec enfants ...
-        # il faut rechercher l'ordonnée du dernier fils de self
-        y_end = self.children[-1].y
-        ligne = self.canvas.create_line(self.x+15,self.y,self.x+15,y_end,tags='line')
-        self.canvas.tag_lower(ligne)
-        for child in self.children :
-            try:
-                child.trace_ligne()
-            except:
-                print "Erreur dans trace_ligne :"
-                print child
-                print child.item.getObject()
-
-    def last_child(self):
-        lchild=self
-        if self.state == 'expanded' and self.children:
-           lchild= self.children[-1].last_child()
-        return lchild
-
-    #------------------------------------------------------------------
-    # Méthodes de création et destruction de noeuds
-    # Certaines de ces méthodes peuvent être appelées depuis l'externe
-    #------------------------------------------------------------------
-    def append_brother(self,name,pos='after',retour='non'):
-        """
-        Permet d'ajouter un objet frère à l'objet associé au noeud self
-        par défaut on l'ajoute immédiatement après 
-        Méthode externe
-        """
-        # on veut ajouter le frère de nom name directement avant ou après self
-        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 à l'objet associé au noeud self.
-           On peut l'ajouter en début de liste (pos='first'), en fin (pos='last')
-           ou en position intermédiaire.
-           Si pos vaut None, on le place à la position du catalogue.
-        """
-        #print "append_child",self,self.children
-        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)
-        #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):
-        """ 
-            Méthode externe pour la destruction de l'objet associé au noeud
-            La mise à jour des noeuds est faite par onSupp sur notification
-        """
-        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()
-
diff --git a/Editeur/uniqueassdpanel.py b/Editeur/uniqueassdpanel.py
deleted file mode 100644 (file)
index bc777b7..0000000
+++ /dev/null
@@ -1,219 +0,0 @@
-# -*- coding: utf-8 -*-
-# ======================================================================
-# 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 Tkinter import *
-import Pmw
-from copy import copy,deepcopy
-import traceback
-
-# Modules Eficas
-import Objecttreeitem
-import prefs
-import panels
-import images
-from widgets import ListeChoix
-from widgets import FenetreDeSelection
-
-from Noyau.N_CR import justify_text
-from utils import substract_list
-
-# Import des panels
-from uniquepanel import UNIQUE_Panel
-
-
-class UNIQUE_ASSD_Panel(UNIQUE_Panel):
-  """
-  Classe servant à définir le panneau associé aux objets qui attendent une valeur unique
-  d'un type dérivé d'ASSD
-  """
-  def valid_valeur_automatique(self):
-      """
-         Réalise la validation d'un concept sans remonter dans le
-         node parent dans le cas ou il n'y a qu'un concept possible (liste de longueur 1)
-         Identique à valid_valeur moins appel de self.node.parent.select()
-         On pourrait supposer que le seul concept présent est valide et donc ne pas
-         réaliser tous les tests de vérification.
-      """
-      if self.parent.modified == 'n' : self.parent.init_modif()
-      valeur = self.get_valeur()
-      self.erase_valeur()
-      anc_val = self.node.item.get_valeur()
-      valeur,validite=self.node.item.eval_valeur_item(valeur)
-      test = self.node.item.set_valeur(valeur)
-      if not test :
-          mess = "impossible d'évaluer : %s " %`valeur`
-          self.parent.appli.affiche_infos("Valeur du mot-clé non autorisée :"+mess)
-      elif self.node.item.isvalid() :
-          self.parent.appli.affiche_infos('Valeur du mot-clé enregistrée')
-          #if self.node.item.get_position()=='global':
-              #self.node.etape.verif_all()
-          #elif self.node.item.get_position()=='global_jdc':
-              #self.node.racine.verif_all()
-          #else :
-              #self.node.parent.verif()
-          #self.node.update()
-      else :
-          cr = self.node.item.get_cr()
-          mess = "Valeur du mot-clé non autorisée :"+cr.get_mess_fatal()
-          self.reset_old_valeur(anc_val,mess=mess)
-
-  def makeValeurPage(self,page,reel="non"):
-      """
-          Génère la page de saisie de la valeur du mot-clé simple courant qui doit être une 
-          SD de type dérivé d'ASSD
-      """
-      # Récupération de l'aide associée au panneau, de l'aide destinée à l'utilisateur,
-      # et de la liste des SD du bon type (constituant la liste des choix)
-      bulle_aide=self.get_bulle_aide()
-      aide=self.get_aide()
-      aide= justify_text(texte=aide)
-      liste_noms_sd = self.node.item.get_sd_avant_du_bon_type()
-
-      # Remplissage du panneau
-      self.valeur_choisie = StringVar()
-      self.valeur_choisie.set('')
-      min,max =  self.node.item.GetMinMax()
-      if (min == 1 and min == max and len(liste_noms_sd)==1 ):
-          if self.valeur_choisie.get() != liste_noms_sd[0]:
-            if ('R' not in self.node.item.get_type()) :
-                self.valeur_choisie.set(liste_noms_sd[0])
-                self.valid_valeur_automatique()
-         
-      self.frame_valeur = Frame(page)
-      self.frame_valeur.pack(fill='both',expand=1)
-      self.frame_valeur.bind("<Button-3>",lambda e,s=self,a=bulle_aide : s.parent.appli.affiche_aide(e,a))
-      self.frame_valeur.bind("<ButtonRelease-3>",self.parent.appli.efface_aide)
-      self.listbox = Pmw.ScrolledListBox(self.frame_valeur,
-                                         items=liste_noms_sd,
-                                         labelpos='n',
-                                         label_text="Structures de données du type\n requis par l'objet courant :",
-                                         listbox_height = 6,
-                                         selectioncommand=self.select_valeur_from_list,
-                                         dblclickcommand=lambda s=self,c=self.valid_valeur : s.choose_valeur_from_list(c))
-      self.listbox.place(relx=0.5,rely=0.3,relheight=0.4,anchor='center')
-      Label(self.frame_valeur,text='Structure de donnée choisie :').place(relx=0.05,rely=0.6)
-      Label(self.frame_valeur,textvariable=self.valeur_choisie).place(relx=0.5,rely=0.6)
-      self.but_val = Button(self.frame_valeur,text = "Valider",command= self.Choisir)
-      self.but_val.place(relx=0.3,rely=0.8,relwidth=0.35)
-
-      # affichage de la valeur courante
-      self.display_valeur()
-      if self.__class__.__name__ == 'UNIQUE_ASSD_Panel_Reel' :
-        Label(self.frame_valeur,text='Valeur Réelle').place(relx=0.1,rely=0.9)
-        self.entry = Entry(self.frame_valeur,relief='sunken')
-        self.entry.place(relx=0.28,rely=0.9,relwidth=0.6)
-        self.entry.bind("<Return>",lambda e,c=self.valid_valeur_reel:c())
-        self.entry.bind("<KP_Enter>",lambda e,c=self.valid_valeur_reel:c())
-
-
-
-  def get_bulle_aide(self):
-      """
-      Retourne l'aide associée au panneau
-      """
-      return "Double-cliquez sur la structure de donnée désirée pour valoriser le mot-clé simple courant"
-
-  def get_aide(self):
-      """
-      Retourne la phrase d'aide indiquant de quel type doit être la valeur à donner par l'utilisateur
-      """
-      mc = self.node.item.get_definition()
-      try :
-              type = mc.type[0].__name__  
-      except :
-        type = str(mc.type[0])
-      if len(mc.type)>1 :
-          for typ in mc.type[1:] :
-              try :
-                l=typ.__name__
-              except:
-                l=str(typ)
-              type = type + ' ou '+l
-      commentaire="Un objet de type "+type+" est attendu"
-      aideval=self.node.item.aide()
-      commentaire=commentaire +"\n"+ aideval
-      return commentaire
-
-    
-  def select_valeur_from_list(self):
-      """
-      Affecte à valeur choisie la sélection courante dans la liste des choix proposée
-      """
-      if len(self.listbox.get()) == 0 : return
-      if len(self.listbox.getcurselection()) == 0 : return
-      choix = self.listbox.getcurselection()[0]
-      self.valeur_choisie.set(choix)
-      self.listbox.component("listbox").focus_set()
-
-  def choose_valeur_from_list(self,command):
-      """
-      Affecte à valeur choisie la sélection courante dans la liste des choix proposée
-      Exécute command
-      """
-      if len(self.listbox.get()) == 0 : return
-      if len(self.listbox.getcurselection()) == 0 : return
-      choix = self.listbox.getcurselection()[0]
-      self.valeur_choisie.set(choix)
-      apply(command,(),{})
-
-  def Choisir(self) :
-      #Appeler par le bouton Valider
-      self.choose_valeur_from_list(self.valid_valeur)
-      
-  def get_valeur(self):
-      """
-      Retourne la valeur donnée par l'utilisateur au MCS
-      """
-      return self.valeur_choisie.get()
-    
-  def display_valeur(self):
-      """
-      Affiche la valeur de l'objet pointé par self
-      """
-      valeur = self.node.item.get_valeur()
-      if valeur == None or valeur == '' : return # pas de valeur à afficher ...
-      self.valeur_choisie.set(getattr(valeur,"nom","unknown"))
-
-  def erase_valeur(self):
-      pass
-
-  def appel_make(self,page):
-      self.makeValeurPage(page,reel="oui")
-      
-class UNIQUE_ASSD_Panel_Reel(UNIQUE_ASSD_Panel):
-  def valid_valeur_reel(self):
-      if self.parent.modified == 'n' : self.parent.init_modif()
-      anc_val = self.node.item.get_valeur()
-      valeurentree = self.entry.get()
-      self.valeur_choisie.set(valeurentree)
-      self.valid_valeur()
-
-  def display_valeur(self):
-      valeur = self.node.item.get_valeur()
-      if valeur == None or valeur == '' : return # pas de valeur à afficher ...
-      if type(valeur) == types.FloatType :
-         self.valeur_choisie.set(valeur)
-      else :
-         self.valeur_choisie.set(valeur.nom)
-
-       
-
diff --git a/Editeur/uniquebasepanel.py b/Editeur/uniquebasepanel.py
deleted file mode 100644 (file)
index 5517def..0000000
+++ /dev/null
@@ -1,153 +0,0 @@
-# -*- 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 Tkinter import *
-from Tkinter import Widget
-import Pmw
-from copy import copy,deepcopy
-import traceback
-
-# Modules Eficas
-import Objecttreeitem
-import prefs
-import panels
-import images
-from widgets import FenetreDeParametre
-from widgets import showerror
-
-from Noyau.N_CR import justify_text
-from utils import substract_list
-
-# Import des panels
-from uniquepanel import UNIQUE_Panel
-
-
-class UNIQUE_BASE_Panel(UNIQUE_Panel):
-  """
-  Classe servant à définir le panneau associé aux mots-clés simples qui attendent
-  une valeur d'un type de base (entier, réel ou string).
-  """
-  def makeValeurPage(self,page):
-      """
-      Génère la page de saisie de la valeur du mot-clé simple courant qui doit être de type
-      de base cad entier, réel, string ou complexe
-      """
-      # Récupération de l'aide associée au panneau, de l'aide destinée à l'utilisateur,
-      # et de la liste des SD du bon type (constituant la liste des choix)
-      bulle_aide=self.get_bulle_aide()
-      aide=self.get_aide()
-      aide= justify_text(texte=aide)
-      liste_noms_sd = self.node.item.get_sd_avant_du_bon_type()
-      # Remplissage du panneau
-      self.frame_valeur = Frame(page)
-      self.frame_valeur.pack(fill='both',expand=1)
-      self.frame_valeur.bind("<Button-3>",lambda e,s=self,a=bulle_aide : s.parent.appli.affiche_aide(e,a))
-      self.frame_valeur.bind("<ButtonRelease-3>",self.parent.appli.efface_aide)
-      self.label = Label(self.frame_valeur,text='Valeur :')
-      #self.label.place(relx=0.1,rely=0.2)
-      self.label.grid(row=0,padx=5,pady=5)
-      self.entry = Entry(self.frame_valeur,relief='sunken')
-      #self.entry.place(relx=0.28,rely=0.2,relwidth=0.6)
-      self.entry.grid(row=0,column=1,padx=5,pady=5)
-      self.entry.bind("<Return>",lambda e,c=self.valid_valeur:c())
-      self.entry.bind("<KP_Enter>",lambda e,c=self.valid_valeur:c())
-      # aide associée au panneau
-      self.frame_valeur.update()
-      self.aide = Label(self.frame_valeur, 
-                        text = aide,
-                        wraplength=int(self.frame_valeur.winfo_width()*0.8),
-                        justify='center')
-      #self.aide.place(relx=0.5,rely=0.9,anchor='n')
-      self.aide.grid(row=4,columnspan=2,padx=5,pady=5)
-      # bouton parametre
-      bouton_parametres = Button(self.frame_valeur, text="Parametres", command=self.affiche_parametre)
-      #bouton_parametres.place(relx=0.28,rely=0.5,relwidth=0.4)
-      bouton_parametres.grid(row=2,columnspan=2,padx=5,pady=5)
-      bouton_val = Button(self.frame_valeur, text="Valider", command=self.valide)
-      #bouton_val.place(relx=0.28,rely=0.6,relwidth=0.4)
-      bouton_val.grid(row=3,columnspan=2,padx=5,pady=5)
-      # affichage de la valeur du MCS
-      self.display_valeur()
-
-  def valide(self):
-      self.valid_valeur()
-
-  def affiche_parametre(self) :
-     if self.node.item.get_liste_param_possible() != [ ]:
-        txtparam=""
-        for param in self.node.item.get_liste_param_possible():
-           txtparam=txtparam+repr(param)+"\n"
-        if txtparam=="":
-           showerror("Aucun parametre ","Pas de parametre de ce type")
-        else :
-           try :
-                   self.fenetreparam.destroy()
-           except :
-                pass
-           self.fenetreparam=FenetreDeParametre( self, self.node.item, self.parent.appli, txtparam)
-
-  def destroy(self):
-      try :
-              self.fenetreparam.destroy()
-      except :
-        pass
-      Widget.destroy(self)
-
-  def get_aide(self):
-      """
-      Retourne la phrase d'aide indiquant de quel type doit être la valeur
-      du mot-clé simple fournie par l'utilisateur
-      """
-      mc = self.node.item.get_definition()
-      d_aides = { 'TXM' : "Une chaîne de caractères est attendue",
-                  'R'   : "Un réel est attendu",
-                  'I'   : "Un entier est attendu"}
-      type = mc.type[0]
-      commentaire=d_aides.get(type,"Type de base inconnu")
-      aideval=self.node.item.aide()
-      commentaire=commentaire +"\n"+ aideval
-      return commentaire
-
-  def get_bulle_aide(self):
-      """
-      Retourne la bulle d'aide associée au panneau et affichée par clic droit
-      """
-      return """Saisissez la valeur que vous voulez affecter au mot-clé simple
-      dans la zone de saisie et pressez <Return>"""
-      
-  def display_valeur(self):
-      """
-      Affiche la valeur de l'objet pointé par self
-      """
-      valeur = self.node.item.get_valeur()
-      if valeur == None or valeur == '' : # pas de valeur à afficher ...
-         self.entry.delete(0,END)
-         self.entry.focus()
-         return
-
-      valeur_texte=self.get_valeur_texte(valeur)
-      if valeur_texte != "":
-         valeur=valeur_texte
-      self.entry.delete(0,END)
-      self.entry.insert(0,valeur)
-      self.entry.focus()
-      
diff --git a/Editeur/uniquecomppanel.py b/Editeur/uniquecomppanel.py
deleted file mode 100644 (file)
index 3aa0907..0000000
+++ /dev/null
@@ -1,171 +0,0 @@
-# -*- 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 Tkinter import *
-import Pmw
-from copy import copy,deepcopy
-import traceback
-
-# Modules Eficas
-import Objecttreeitem
-import prefs
-import panels
-import images
-from widgets import ListeChoix
-from widgets import FenetreDeSelection
-
-from Noyau.N_CR import justify_text
-from utils import substract_list
-
-# Import des panels
-from uniquepanel import UNIQUE_Panel
-
-      
-class UNIQUE_COMP_Panel(UNIQUE_Panel):
-  """
-  Classe servant à définir le panneau associé aux mots-clés simples
-  qui attendent une valeur de type complexe
-  """
-  def makeValeurPage(self,page):
-      """
-      Génère la page de saisie de la valeur du mot-clé simple courant qui doit être de type
-      de base cad entier, réel, string ou complexe
-      """
-      # Récupération de l'aide associée au panneau et de l'aide destinée à l'utilisateur
-      bulle_aide=self.get_bulle_aide()
-      aide=self.get_aide()
-      aide= justify_text(texte=aide)
-      # Remplissage du panneau
-      self.frame_valeur = Frame(page)
-      self.frame_valeur.pack(fill='both',expand=1)
-      self.frame_valeur.bind("<Button-3>",lambda e,s=self,a=bulle_aide : s.parent.appli.affiche_aide(e,a))
-      self.frame_valeur.bind("<ButtonRelease-3>",self.parent.appli.efface_aide)
-      self.label  = Label(self.frame_valeur,text='Complexe de la forme : a+bj')
-      self.label1 = Label(self.frame_valeur,text='Imaginaire')
-      self.label2 = Label(self.frame_valeur,text='Phase')
-      self.label3 = Label(self.frame_valeur,text='OU')
-      self.label.place (relx=0.15,rely=0.1)
-      self.label1.place(relx=0.6,rely=0.50)
-      self.label2.place(relx=0.6,rely=0.57)
-      self.label3.place(relx=0.15,rely=0.4)
-      self.typ_cplx=StringVar()
-      self.typ_cplx.set('RI')
-      rb1 = Radiobutton(self.frame_valeur, text='RI  : Réel',variable=self.typ_cplx,value='RI')
-      rb2 = Radiobutton(self.frame_valeur, text='MP  : Module',variable=self.typ_cplx,value='MP')
-      rb1.place(relx=0.15,rely = 0.50)
-      rb2.place(relx=0.15,rely = 0.57)
-      self.entry1 = Pmw.EntryField(self.frame_valeur,validate='real')
-      self.entry2 = Pmw.EntryField(self.frame_valeur,validate='real')
-      self.entry3 = Pmw.EntryField(self.frame_valeur)
-      self.entry1.component('entry').bind("<Return>",lambda e,s=self:s.entry2.component('entry').focus())
-      self.entry1.component('entry').bind("<KP_Enter>",lambda e,s=self:s.entry2.component('entry').focus())
-      self.entry2.component('entry').bind("<Return>",lambda e,c=self.valid_valeur:c())
-      self.entry2.component('entry').bind("<KP_Enter>",lambda e,c=self.valid_valeur:c())
-      self.entry3.component('entry').bind("<Return>",lambda e,c=self.valid_complexe:c())
-      self.entry3.component('entry').bind("<KP_Enter>",lambda e,c=self.valid_complexe:c())
-      self.entry1.place(relx=0.15,rely = 0.65,relwidth=0.35)
-      self.entry2.place(relx=0.60,rely = 0.65,relwidth=0.35)
-      self.entry3.place(relx=0.15,rely = 0.20,relwidth=0.60)
-      self.entry1.focus()
-      self.bouton_val=Button(self.frame_valeur,text="Valider",command=self.valider,width=14)
-      self.bouton_val.place(relx=0.4,rely=0.8)
-      self.frame_valeur.update()
-      self.aide = Label(self.frame_valeur,
-                        text = aide,
-                        wraplength=int(self.frame_valeur.winfo_width()*0.8),
-                        justify='center')
-      self.aide.place(relx=0.5,rely=0.9,anchor='n')
-      # affichage de la valeur du MCS
-      self.display_valeur()
-
-  def valider(self):
-      if ((self.entry3.get() != None) and (self.entry3.get() != "" )):
-         self.erase_valeur()
-         self.valid_complexe()
-      else :
-         self.valid_valeur()
-         
-
-  def display_valeur(self):
-      """
-      Affiche la valeur de l'objet pointé par self
-      """
-      valeur = self.node.item.get_valeur()
-      if valeur == None or valeur == '' : return # pas de valeur à afficher ...
-      self.entry1.delete(0,END)
-      self.entry2.delete(0,END)
-      self.entry3.delete(0,END)
-      if type(valeur) not in (types.ListType,types.TupleType) :
-         self.display_complexe()
-      else:
-         typ_cplx,x1,x2=valeur
-         self.typ_cplx.set(typ_cplx)
-         self.entry1.setentry(x1)
-         self.entry2.setentry(x2)
-
-  def display_complexe(self):
-      valeur = self.node.item.get_valeur()
-      self.entry3.setentry(valeur)
-
-  def get_bulle_aide(self):
-      """
-      Retourne la bulle d'aide du panneau
-      """
-      return """-Choisissez votre format de saisie du complexe :
-      \t 'RI' = parties réelle et imaginaire
-      \t 'MP' = module/phase (en degrés)
-      - Saisissez ensuite dans les deux zones de saisie les deux nombres attendus"""
-
-  def get_aide(self):
-      """
-      Retourne la phrase d'aide décrivant le type de la valeur que peut prendre
-      le mot-clé simple courant
-      """
-      commentaire='Un complexe est attendu'
-      aideval=self.node.item.aide()
-      commentaire=commentaire +"\n"+ aideval
-      return commentaire
-
-  def get_valeur(self):
-      """
-      Retourne le complexe saisi par l'utilisateur
-      """
-      l=[]
-      l.append(self.typ_cplx.get())
-      try :
-         l.append(string.atof(self.entry1.get()))
-         l.append(string.atof(self.entry2.get()))
-      except :
-         return None
-      return `tuple(l)`
-
-  def erase_valeur(self):
-      """
-      Efface les entries de saisie
-      """
-      self.typ_cplx.set('RI')
-      self.entry1.delete(0,END)
-      self.entry2.delete(0,END)
-      
-  def valid_complexe(self):
-      valeurentree=self.entry3.get()
-      self.valid_valeur(valeurentree=valeurentree)
diff --git a/Editeur/uniqueintopanel.py b/Editeur/uniqueintopanel.py
deleted file mode 100644 (file)
index 6532e3f..0000000
+++ /dev/null
@@ -1,94 +0,0 @@
-# -*- 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 Tkinter import *
-import Pmw
-from copy import copy,deepcopy
-import traceback
-
-# Modules Eficas
-import Objecttreeitem
-import prefs
-import panels
-import images
-from widgets import ListeChoix
-from widgets import FenetreDeSelection
-
-from Noyau.N_CR import justify_text
-from utils import substract_list
-
-# Import des panels
-from uniquepanel import UNIQUE_Panel
-
-class UNIQUE_INTO_Panel(UNIQUE_Panel):
-  """
-  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 makeValeurPage(self,page):
-      """
-      Génère la page de saisie d'une seule valeur parmi un ensemble
-      discret de possibles
-      """
-      # récupération de la bulle d'aide et de l'objet mc
-      bulle_aide=self.get_bulle_aide()
-      objet_mc = self.node.item.get_definition()
-      # remplissage du panel
-      self.frame_valeur = Frame(page)
-      self.frame_valeur.pack(fill='both',expand=1)
-      self.frame_valeur.bind("<Button-3>",lambda e,s=self,a=bulle_aide : 
-                              s.parent.appli.affiche_aide(e,a))
-      self.frame_valeur.bind("<ButtonRelease-3>",self.parent.appli.efface_aide)
-      #l_choix=list(objet_mc.into)
-      #l_choix.sort()
-      l_choix=self.node.item.get_liste_possible([])
-      self.label = Label(self.frame_valeur,text='Choisir une valeur :')
-      self.label.pack(side='top')
-      self.frame = Frame(page)
-      self.frame.place(relx=0.33,rely=0.2,relwidth=0.33,relheight=0.6)
-
-
-      liste_commandes = (("<Button-1>",self.selectChoix),
-                         ("<Button-3>",self.deselectChoix),
-                         ("<Double-Button-1>",self.record_valeur))
-      self.Liste_choix = ListeChoix(self,self.frame,l_choix,
-                                    liste_commandes = liste_commandes,
-                                    titre="Valeurs possibles",optionReturn="oui")
-      self.Liste_choix.affiche_liste()
-      self.bouton_val = Button(self.frame_valeur,
-                               text = "Valider",
-                               command=self.record_valeur_ligne,
-                               width=14)
-      self.bouton_val.place(relx=0.33,rely=0.85)
-
-  def record_valeur_ligne(self):
-      valeur=self.Liste_choix.arg_selected
-      self.record_valeur(valeur)
-
-  def get_bulle_aide(self):
-      """
-      Retourne la bulle d'aide affectée au panneau courant (affichée par clic droit)
-      """
-      return """Double-cliquez sur la valeur désirée
-      pour valoriser le mot-clé simple courant"""
-
diff --git a/Editeur/uniquepanel.py b/Editeur/uniquepanel.py
deleted file mode 100644 (file)
index a622b8a..0000000
+++ /dev/null
@@ -1,93 +0,0 @@
-# -*- 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 Tkinter import *
-import Pmw
-from copy import copy,deepcopy
-import traceback
-
-# Modules Eficas
-import Objecttreeitem
-import prefs
-import panels
-import images
-from widgets import ListeChoix
-from widgets import FenetreDeSelection
-
-from Noyau.N_CR import justify_text
-from utils import substract_list
-
-# Import des panels
-from newsimppanel import newSIMPPanel
-
-    
-class UNIQUE_Panel(newSIMPPanel):
-  """
-  Classe virtuelle servant de classe mère à toutes celles définissant un panneau
-  permettant l'affichage et la saisie d'une valeur unique pour le mot-clé simple
-  """
-
-  def erase_valeur(self):
-      """
-      Efface l'entry de saisie
-      """
-      self.entry.delete(0,END)
-
-  def get_valeur(self):
-      """
-      Retourne la valeur donnée par l'utilisateur
-      """
-      return self.entry.get()
-    
-  
-  def valid_valeur(self,valeurentree=None):
-      """
-      Teste si la valeur fournie par l'utilisateur est une valeur permise :
-      - si oui, l'enregistre
-      - si non, restaure l'ancienne valeur
-      """
-      if self.parent.modified == 'n' : self.parent.init_modif()
-      anc_val = self.node.item.get_valeur()
-      if valeurentree== None :
-         valeurentree = self.get_valeur()
-      valeur,validite=self.node.item.eval_valeur(valeurentree)
-      if not validite :
-             commentaire = "impossible d'évaluer : %s " %`valeurentree`
-             self.display_valeur()
-             self.parent.appli.affiche_infos(commentaire)
-             return
-   
-      test = self.node.item.set_valeur(valeur)
-      if test :
-          self.set_valeur_texte(str(valeurentree))
-       
-      if not test :
-          mess = "impossible d'évaluer : %s " %`valeur`
-          self.parent.appli.affiche_infos("Valeur du mot-clé non autorisée : "+mess)
-      elif self.node.item.isvalid() :
-          self.parent.appli.affiche_infos('Valeur du mot-clé enregistrée')
-      else :
-          cr = self.node.item.get_cr()
-          mess = "Valeur du mot-clé non autorisée "+cr.get_mess_fatal()
-          self.reset_old_valeur(anc_val,mess=mess)
-
-      self.display_valeur()
diff --git a/Editeur/uniquesdcopanel.py b/Editeur/uniquesdcopanel.py
deleted file mode 100644 (file)
index 6c3f1fc..0000000
+++ /dev/null
@@ -1,246 +0,0 @@
-# -*- 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 Tkinter import *
-import Pmw
-from copy import copy,deepcopy
-import traceback
-
-# Modules Eficas
-import Objecttreeitem
-import prefs
-import panels
-import images
-from widgets import ListeChoix
-from widgets import FenetreDeSelection
-
-from Noyau.N_CR import justify_text
-from utils import substract_list
-
-# Import des panels
-from uniqueassdpanel import UNIQUE_ASSD_Panel
-
-
-class UNIQUE_SDCO_Panel(UNIQUE_ASSD_Panel):
-  """
-  Classe servant à définir le panneau correspondant à un mot-clé simple
-  qui attend une valeur unique de type dérivé d'ASSD ou non encore
-  existante (type CO(...) utilisé dans les macros uniquement)
-  """
-  def makeValeurPage(self,page):
-      """
-      Génère la page de saisie de la valeur du mot-clé simple courant qui doit être une SD de type dérivé
-      d'ASSD
-      """
-      # Récupération de l'aide associée au panneau, de l'aide destinée à l'utilisateur,
-      # et de la liste des SD du bon type (constituant la liste des choix)
-      bulle_aide=self.get_bulle_aide()
-      aide=self.get_aide()
-      aide= justify_text(texte=aide)
-      liste_noms_sd = self.node.item.get_sd_avant_du_bon_type()
-      # Remplissage du panneau
-      self.frame_valeur = Frame(page)
-      self.frame_valeur.pack(fill='both',expand=1)
-      self.frame_valeur.bind("<Button-3>",lambda e,s=self,a=bulle_aide : s.parent.appli.affiche_aide(e,a))
-      self.frame_valeur.bind("<ButtonRelease-3>",self.parent.appli.efface_aide)
-      # affichage de la liste des SD existantes et du bon type
-      self.listbox = Pmw.ScrolledListBox(self.frame_valeur,
-                                         items=liste_noms_sd,
-                                         labelpos='n',
-                                         label_text="Structures de données du type\n requis par l'objet courant :",
-                                         listbox_height = 6,
-                                         selectioncommand=self.select_valeur_from_list,
-                                         dblclickcommand=lambda s=self,c=self.valid_valeur : s.choose_valeur_from_list(c))
-      self.listbox.component("listbox").bind("<Return>",lambda e,s=self,c=self.valid_valeur : s.choose_valeur_from_list(c))
-      if liste_noms_sd != [] :
-         self.listbox.place(relx=0.5,rely=0.3,relheight=0.4,anchor='center')
-         self.b_co = Pmw.OptionMenu(self.frame_valeur,labelpos='w',label_text = "Nouveau concept : ", items = ('NON','OUI'),
-                                         menubutton_width=10)
-      else :
-         self.b_co = Pmw.OptionMenu(self.frame_valeur,labelpos='w',label_text = "Nouveau concept : ", items = ('OUI',),
-                                         menubutton_width=10)
-      # affichage du bouton 'Nouveau concept'
-      self.b_co.configure(command = self.ask_new_concept)
-      if liste_noms_sd != [] :
-         self.b_co.place(relx=0.05,rely=0.6,anchor='w')
-      else :
-         self.b_co.place(relx=0.05,rely=0.3,anchor='w')
-      self.label_co = Label(self.frame_valeur,text='Nom du nouveau concept :')
-      self.entry_co = Entry(self.frame_valeur)
-      self.entry_co.bind('<Return>',self.valid_nom_concept_co)
-      self.entry_co.bind('<KP_Enter>',self.valid_nom_concept_co)
-      # affichage du label de la structure de donnée choisie
-      self.l_resu = Label(self.frame_valeur,text='Structure de donnée choisie :')
-      self.valeur_choisie = StringVar()
-      self.label_valeur = Label(self.frame_valeur,textvariable=self.valeur_choisie)
-      self.frame_valeur.update()
-      self.aide = Label(self.frame_valeur,
-                        text = aide,
-                        wraplength=int(self.frame_valeur.winfo_width()*0.8),
-                        justify='center')
-      self.aide.place(relx=0.5,rely=0.85,anchor='n')
-
-      self.but_val = Button(self.fr_but,text = "Valider",command= self.valid_nom_concept_co)
-      self.but_val.pack(side='right',padx=5, pady=5)
-
-      # affichage de la valeur courante
-      self.display_valeur()
-      if liste_noms_sd == [] :
-          self.b_co.invoke('OUI')
-      
-  def get_bulle_aide(self):
-      """
-      Retourne la bulle d'aide du panneau
-      """
-      return """Double-cliquez sur la structure de donnée désirée
-      pour valoriser le mot-clé simple courant ou cliquez sur NOUVEAU CONCEPT pour
-      entrer le nom d'un concept non encore existant"""
-
-  def valid_valeur(self):
-      """
-      Teste si la valeur fournie par l'utilisateur est une valeur permise :
-      - si oui, l'enregistre
-      - si non, restaure l'ancienne valeur
-      """
-      if self.parent.modified == 'n' : self.parent.init_modif()
-      valeur = self.get_valeur()
-      #print "valid_valeur",valeur
-
-      self.erase_valeur()
-      anc_val = self.node.item.get_valeur()
-      test_CO=self.node.item.is_CO(anc_val)
-      #PN essai pour bug dans MACRO_PROJ_BASE 
-      valeur,validite=self.node.item.eval_valeur(valeur)
-      test = self.node.item.set_valeur(valeur)
-      if not test :
-          mess = "impossible d'évaluer : %s " %`valeur`
-          self.parent.appli.affiche_infos("Valeur du mot-clé non autorisée :"+mess)
-          return
-      #PN essai pour bug dans MACRO_PROJ_BASE 
-      #elif self.node.item.isvalid() :
-      elif validite: 
-          self.parent.appli.affiche_infos('Valeur du mot-clé enregistrée')
-          if test_CO:
-             # il faut egalement propager la destruction de l'ancien concept
-             self.node.item.delete_valeur_co(valeur=anc_val)
-             # et on force le recalcul des concepts de sortie de l'etape
-             self.node.item.object.etape.get_type_produit(force=1)
-             # et le recalcul du contexte
-             self.node.item.object.etape.parent.reset_context()
-          self.node.parent.select()
-      else :
-          cr = self.node.item.get_cr()
-          mess = "Valeur du mot-clé non autorisée :"+cr.get_mess_fatal()
-          self.reset_old_valeur(anc_val,mess=mess)
-          return
-
-  def valid_nom_concept_co(self,event=None):
-      """
-      Lit le nom donné par l'utilisateur au concept de type CO qui doit être
-      la valeur du MCS courant et stocke cette valeur
-      """
-      #print "valid_nom_concept_co"
-      if self.parent.modified == 'n' : self.parent.init_modif()
-      anc_val = self.node.item.get_valeur()
-      if anc_val != None:
-          # il faut egalement propager la destruction de l'ancien concept
-          self.node.item.delete_valeur_co(valeur=anc_val)
-          # et on force le recalcul des concepts de sortie de l'etape
-          self.node.item.object.etape.get_type_produit(force=1)
-          # et le recalcul du contexte
-          self.node.item.object.etape.parent.reset_context()
-      nom_concept = self.entry_co.get()
-      #print "valid_nom_concept_co",nom_concept
-      test,mess=self.node.item.set_valeur_co(nom_concept)
-      if not test:
-          # On n'a pas pu créer le concept
-          self.parent.appli.affiche_infos(mess)
-          return
-      elif self.node.item.isvalid() :
-          self.parent.appli.affiche_infos('Valeur du mot-clé enregistrée')
-          self.node.parent.select()
-      else :
-          cr = self.node.item.get_cr()
-          mess = "Valeur du mot-clé non autorisée :"+cr.get_mess_fatal()
-          self.reset_old_valeur(anc_val,mess=mess)
-          return
-
-  def ask_new_concept(self,tag):
-      """
-      Crée une entry dans le panneau d'un MCS qui attend un concept OU un CO() afin de
-      permettre à l'utilisateur de donner le nom du nouveau concept
-      """
-      new_concept = self.b_co.getcurselection()
-      if new_concept == 'OUI':
-          self.label_co.place(relx=0.05,rely=0.7)
-          self.entry_co.place(relx=0.45,rely=0.7,relwidth=0.25)
-          self.l_resu.place_forget()
-          self.label_valeur.place_forget()
-          self.entry_co.focus()
-      elif new_concept == 'NON':
-          # On est passe de OUI à NON, on supprime la valeur
-# PN correction de bug (on passe de non a non et cela supprime la valeur)
-# ajout du if de le ligne suivane
-          if self.node.item.is_CO():
-                self.node.item.delete_valeur_co()
-                self.record_valeur(name=None,mess="Suppression CO enregistrée")
-                self.label_co.place_forget()
-                self.entry_co.place_forget()
-                self.l_resu.place(relx=0.05,rely=0.7)
-                self.label_valeur.place(relx=0.45,rely=0.7)
-          
-  def display_valeur(self):
-      """
-      Affiche la valeur de l'objet pointé par self
-      """
-      valeur = self.node.item.get_valeur()
-      #print "display_valeur",valeur
-      if valeur == None or valeur == '': 
-         self.valeur_choisie.set('')
-         return # pas de valeur à afficher ...
-      # il faut configurer le bouton si la valeur est un objet CO
-      # sinon afficher le nom du concept dans self.valeur_choisie
-      if self.node.item.is_CO():
-          #print "display_valeur.is_CO"
-          self.b_co.invoke('OUI')
-          self.entry_co.insert(0,valeur.nom)
-      else:
-          self.valeur_choisie.set(valeur.nom)
-
-  def record_valeur(self,name=None,mess='Valeur du mot-clé enregistrée'):
-      """
-      Enregistre  val comme valeur de self.node.item.object SANS faire de test de validité
-      """
-      if self.parent.modified == 'n' : self.parent.init_modif()
-      if name != None:
-          valeur =name
-      else :
-          self.entry_co.delete(0,END)
-          valeur= self.entry_co.get()
-      self.node.item.set_valeur_co(valeur)
-      self.parent.appli.affiche_infos(mess)
-      # On met a jour le display dans le panneau
-      self.display_valeur()
-      if self.node.item.isvalid():
-          self.node.parent.select()
-
-
diff --git a/Editeur/widgets.py b/Editeur/widgets.py
deleted file mode 100644 (file)
index 83c51ff..0000000
+++ /dev/null
@@ -1,1386 +0,0 @@
-# -*- 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.
-#
-#
-# ======================================================================
-# ----------------------------------------------------------
-#   Cette classe sert à définir les widgets utilisés par
-#          EFICAS
-# ----------------------------------------------------------
-
-import Tkinter
-from Tkinter import *
-import Pmw
-import os,sys,re,string
-import types,fnmatch
-import traceback
-from tkFileDialog import *
-from tkMessageBox import showinfo,askyesno,showerror,askretrycancel
-
-import fontes
-import prefs
-from utils import save_in_file
-from centerwindow import centerwindow
-
-from Noyau.N_utils import repr_float
-from Accas import AsException
-
-# Surcharge de la fonction askyesno qui retourne un resultat errone en Python 2.3 avec Tk 8.4
-# et Tkinter.wantobject==1
-import tkMessageBox
-def askyesno(title=None, message=None, **options):
-    "Ask a question; return true if the answer is yes"
-    s = tkMessageBox._show(title, message, tkMessageBox.QUESTION, tkMessageBox.YESNO, **options)
-    if s == tkMessageBox.YES:return 1
-    if s == tkMessageBox.NO:return 0
-    if s:return 1
-    return 0
-
-    
-class Fenetre :
-    """ Cette classe permet de créer une fenêtre Toplevel dans laquelle
-        on peut afficher un texte et qui permet de le sauver"""
-    def __init__(self,appli,titre="",texte="",wrap=WORD,width=100,height=30):
-        self.appli=appli
-        if self.appli.test==1 : return
-        self.fenetre = Toplevel()
-        self.fenetre.withdraw()
-        #self.fenetre.configure(width = 800,height=500)
-        self.fenetre.protocol("WM_DELETE_WINDOW", self.quit)
-        self.fenetre.title("Visualisation du "+titre)
-        self.texte = string.replace(texte,'\r\n','\n')
-        self.titre = titre
-        fonte=fontes.standardcourier10
-        # définition des frames
-        self.frame_texte = Frame(self.fenetre)
-        self.frame_boutons = Frame(self.fenetre)
-        #self.frame_texte.place(relx=0,rely=0,relwidth=1,relheight=0.9)
-        #self.frame_boutons.place(relheight=0.1,relx=0,rely=0.9,relwidth=1.)
-        # définition de la zone texte et du scrollbar
-        self.zone_texte = Text(self.frame_texte,font=fonte,wrap=wrap,
-                               height=height,width=width)
-        self.zone_texte.bind("<Key-Prior>", self.page_up)
-        self.zone_texte.bind("<Key-Next>", self.page_down)
-        self.zone_texte.bind("<Key-Up>", self.unit_up)
-        self.zone_texte.bind("<Key-Down>", self.unit_down)
-        self.scroll_v = Scrollbar (self.frame_texte,command = self.zone_texte.yview)
-        #self.scroll_h = Scrollbar (self.frame_texte,command = self.zone_texte.xview)
-        self.scroll_v.pack(side='right',fill ='y')
-        #self.scroll_h.pack(side='bottom',fill ='x')
-        self.zone_texte.pack(side='top',fill='both',expand=1,padx=5,pady=10)
-        self.zone_texte.configure(yscrollcommand=self.scroll_v.set)
-        # définition des boutons
-        self.but_quit = Button(self.frame_boutons,text = "Fermer",command=self.quit,
-                                default='active')
-        self.but_save = Button(self.frame_boutons,text = "Sauver",command = self.save)
-        #self.but_quit.place(relx=0.4,rely=0.5,anchor='center')
-        #self.but_save.place(relx=0.6,rely=0.5,anchor='center')
-        self.but_quit.pack(side='left',padx=25, pady=5)
-        self.but_save.pack(side='right',padx=25, pady=5)
-        self.frame_texte.pack(side='top',fill='both',expand=1)
-        self.frame_boutons.pack(side='bottom')
-        self.zone_texte.focus_set()
-        self.fenetre.bind('<Return>',self.quit) #dismiss window
-
-        # affichage du texte
-        self.affiche_texte(self.texte)
-        self.zone_texte.config(state=DISABLED)
-        centerwindow(self.fenetre)
-        self.fenetre.deiconify()
-
-    def page_up(self,event):
-        event.widget.yview_scroll(-1, "page")
-        return "break" #Pour eviter la propagation de l'evenement a la fenetre principale
-    def page_down(self,event):
-        event.widget.yview_scroll(1, "page")
-        return "break" #Pour eviter la propagation de l'evenement a la fenetre principale
-    def unit_up(self,event):
-        event.widget.yview_scroll(-1, "unit")
-        return "break" #Pour eviter la propagation de l'evenement a la fenetre principale
-    def unit_down(self,event):
-        event.widget.yview_scroll(1, "unit")
-        return "break" #Pour eviter la propagation de l'evenement a la fenetre principale
-
-    def wait(self):
-        self.fenetre.grab_set()
-        self.zone_texte.focus_set()
-        self.fenetre.wait_window(self.fenetre)
-
-    def quit(self,event=None):
-        self.fenetre.destroy()
-        return "break" #Pour eviter la propagation de l'evenement a la fenetre principale
-
-    def efface_scroll(self):
-        """ Efface le scroll lorsqu'il n'est pas nécessaire : ne marche pas"""
-        self.scroll_v.pack_forget()
-        #self.scroll_h.pack_forget()
-
-    def affiche_texte(self,texte):
-        """ Affiche le texte dans la fenêtre """
-        if texte != "" :
-            self.zone_texte.insert(END,texte)
-            try:
-                self.fenetre.update_idletasks()
-                x0,y0,x1,y1 = self.zone_texte.bbox(END)
-                if (y1-y0) < 300 : self.efface_scroll()
-            except:
-                pass
-
-    def save(self):
-        """ Permet de sauvegarder le texte dans un fichier dont on a demandé le nom
-        à l'utilisateur """
-        file = asksaveasfilename(parent=self.fenetre,defaultextension = '.comm',
-                               #initialdir = self.appli.CONFIGURATION.rep_user,
-                               initialdir = self.appli.CONFIGURATION.initialdir,
-                               title="Sauvegarde du "+self.titre)
-        if file :
-            if not save_in_file(file,self.texte,None) :
-                showerror("Sauvegarde impossible",
-                       "Impossible de sauvegarder le texte dans le fichier spécifié\n"+
-                          "Vérifiez les droits d'écriture",parent=self.fenetre)
-            else:
-                showinfo("Sauvegarde effectuée","Sauvegarde effectuée dans le fichier %s" %file,parent=self.fenetre)
-
-    def destroy(self):
-        try :
-           self.fenetre.destroy()
-        except :
-           pass
-
-class FenetreSurLigneWarning(Fenetre):
-
-    def affiche_texte(self,texte):
-        """ Affiche le texte dans la fenêtre """
-        ligne=0
-        if texte != "" :
-           texte_cr=texte.splitlines()
-           for l in texte_cr:
-                ligne=ligne+1
-                l=l+"\n"
-                self.zone_texte.insert(END,l)
-                if (l.find("WARNING") > -1) or (l.find("ERROR") > -1) : 
-                   self.zone_texte.tag_add( "Rouge", str(ligne)+".0", "end-1c" )
-                   self.zone_texte.tag_config("Rouge", foreground='red')
-           try:
-                self.fenetre.update_idletasks()
-                x0,y0,x1,y1 = self.zone_texte.bbox(END)
-                if (y1-y0) < 300 : self.efface_scroll()
-           except:
-                pass
-
-class FenetreYesNo(Fenetre):
-    def __init__(self,appli,titre="",texte="",yes="Yes",no="No"):
-        self.appli=appli
-        self.fenetre = Toplevel()
-        self.fenetre.configure(width = 800,height=500)
-        self.fenetre.protocol("WM_DELETE_WINDOW", self.quit)
-        self.fenetre.title(titre)
-        self.texte = string.replace(texte,'\r\n','\n')
-        self.titre = titre
-        fonte=fontes.standardcourier10
-        # définition des frames
-        self.frame_texte = Frame(self.fenetre)
-        self.frame_boutons = Frame(self.fenetre)
-        self.frame_boutons.place(relx=0,rely=0,    relwidth=1.,relheight=0.1)
-        self.frame_texte.place(  relx=0,rely=0.1,  relwidth=1, relheight=0.9)
-        # définition de la zone texte et du scrollbar
-        self.zone_texte = Text(self.frame_texte,font=fonte)
-        self.zone_texte.bind("<Key-Prior>", self.page_up)
-        self.zone_texte.bind("<Key-Next>", self.page_down)
-        self.zone_texte.bind("<Key-Up>", self.unit_up)
-        self.zone_texte.bind("<Key-Down>", self.unit_down)
-        self.scroll_v = Scrollbar (self.frame_texte,command = self.zone_texte.yview)
-        #self.scroll_h = Scrollbar (self.frame_texte,command = self.zone_texte.xview)
-        self.scroll_v.pack(side='right',fill ='y')
-        #self.scroll_h.pack(side='bottom',fill ='x')
-        self.zone_texte.pack(side='top',fill='both',expand=1,padx=5,pady=10)
-        self.zone_texte.configure(yscrollcommand=self.scroll_v.set)
-        # définition des boutons
-        self.but_yes = Button(self.frame_boutons,text = yes,command=self.yes)
-        self.but_no = Button(self.frame_boutons,text = no,command = self.no)
-        self.but_yes.place(relx=0.4,rely=0.5,anchor='center')
-        self.but_no.place(relx=0.6,rely=0.5,anchor='center')
-        # affichage du texte
-        self.affiche_texte(self.texte)
-        centerwindow(self.fenetre)
-
-    def yes(self):
-        self.result=1
-        self.quit()
-
-    def no(self):
-        self.result=0
-        self.quit()
-
-class FenetreDeSelection(Fenetre):
-    """ Classe dérivée de Fenêtre permettant la récupération d'une zone de texte sélectionnée.
-        Cette classe est utilisée pour affecter une liste de valeurs à un mot-clé.
-    """
-    def __init__(self,panel,item,appli,titre="",texte="",cardinal=1):
-        Fenetre.__init__(self,appli,titre=titre,texte=texte)
-        self.frame_boutons.place_forget()
-        self.frame_texte.place_forget()
-        self.frame_texte.place(relx=0,rely=0,relwidth=1,relheight=0.8)
-        self.frame_boutons.place(relheight=0.2,relx=0,rely=0.8,relwidth=1.)
-
-        self.cardinal=cardinal
-        self.fenetre.configure(width = 320,height=400)
-        centerwindow(self.fenetre)
-        self.panel = panel
-        self.item = item
-        self.fenetre.title(titre)
-        self.but_save.configure(text="Ajouter",command=self.traite_selection)
-        # séparateur par défaut
-        self.separateur = ';'
-        # création de la zone de saisie du séparateur
-        l_separateurs_autorises = self.get_separateurs_autorises()
-        self.choix_sep = Pmw.ComboBox(self.frame_boutons,
-                                      label_text = "Séparateur :",
-                                      labelpos = 'w',
-                                      listheight = 100,
-                                      selectioncommand = self.choose_separateur,
-                                      scrolledlist_items = l_separateurs_autorises)
-        self.choix_sep.component('entry').configure(width=6)
-        self.choix_sep.place(relx=0.01,rely=0.5,anchor='w')
-        self.choix_sep.selectitem(self.separateur)
-        # Replacement
-        self.but_quit.place_forget()
-        self.but_save.place_forget()
-        self.but_all  = Button(self.frame_boutons,text = "Tout Sélectionner", command=self.tout)
-        self.but_save.place(relx=0.6,rely=0.6,anchor='center')
-        self.but_quit.place(relx=0.8,rely=0.6,anchor='center')
-        self.but_all.place(relx=0.7,rely=0.2,anchor='center')
-        self.choose_separateur('espace')
-     
-
-    def get_separateurs_autorises(self):
-        """
-        Retourne la liste des séparateurs autorisés
-        """
-        return ['espace',';',',']
-
-    def choose_separateur(self,nom_sep):
-        """
-        Affecte à self.separateur le caractère séparateur correspondant à nom_sep
-        """
-        if nom_sep == 'espace' :
-            self.separateur = ' '
-        else:
-            self.separateur = nom_sep
-        
-    def tout(self):
-        liste=[]
-        texte=self.texte.splitlines()
-        for l in texte :
-            for mot in string.split(l,self.separateur):
-               if mot != '' and mot != ' ' and mot != self.separateur :
-                  liste.append(mot)
-        self.traite_selection(liste)
-
-    def traite_selection(self,liste=None):
-        """ Cette méthode effectue tous les traitements nécessaires pour vérifier
-            et affecter la liste de valeurs à l'objet réprésenté par self.item
-        """
-        # Récupère la liste des chaines de caractères de la zone sélectionnée
-        message=""
-        if liste == None:
-           message,liste = self.recupere_liste()
-        if self.test_probleme(message,"Sélectionnez des données") == 0:
-            return
-        # Vérifie que le nombre de données est dans les limites attendues
-        message = self.verif_liste(liste)
-        if self.test_probleme(message,"Vérifiez le nombre de données") == 0:
-            return
-        # Crée une liste de valeurs du type attendu
-        message,liste_valeurs = self.creation_liste_valeurs(liste)
-        if self.test_probleme(message,"Vérifiez le type des données") == 0:
-            return
-        # Vérifie que chaque valeur est dans le domaine exigé
-        message = self.verif_valeurs(liste_valeurs)
-        if self.test_probleme(message,"Vérifiez le domaine des valeurs") == 0:
-            return
-        # Ajoute les valeurs dans la liste de valeurs du mot-clé
-        if self.cardinal != 1 :
-           nb=self.cardinal
-           l_valeurs=[]
-           # a ameliorer
-           if (len(liste_valeurs)%nb != 0):
-                message="La cardinalité n'est pas correcte"
-                self.test_probleme(message,"On attend des tuples")
-                return
-           for i in range(len(liste_valeurs)/nb) :
-               if (nb==2):
-                   t=(liste_valeurs[i*nb], liste_valeurs[i*nb+1])
-               elif (nb ==3):
-                   t=(liste_valeurs[i*nb], liste_valeurs[i*nb+1], liste_valeurs[i*nb+2])
-               else :
-                  print "probleme : prevenir la maintenance Eficas"
-                  return
-               l_valeurs.append(t)
-           liste_valeurs=l_valeurs
-        self.ajouter_valeurs(liste_valeurs)
-        self.appli.affiche_infos("Liste de valeurs acceptée")
-
-    def test_probleme(self, message, message_eficas):
-        """ Cette méthode affiche un message d'erreur si message != ''
-            et retourne 0, sinon retourne 1 sans rien afficher.
-        """
-        if message != "":
-            showinfo("Problème",message,parent=self.fenetre)
-            self.fenetre.tkraise()
-            self.appli.affiche_infos(message_eficas)
-            return 0
-        else:
-            return 1
-
-    def recupere_liste(self):
-        """ Cette méthode récupère le texte de la zone sélectionnée, construit et
-            retourne une liste avec les chaines qui se trouvent entre les séparateurs.
-            S'il n'y a pas de données selectionnées, elle retourne un message d'erreur
-            et une liste vide.
-        """
-        message = ""
-        try:
-            selection=self.fenetre.selection_get()
-        except:
-            message = "Pas de donnée sélectionnée"
-            return message,None
-        # les retours chariots doivent être interprétés comme des séparateurs
-        selection = string.replace(selection,'\n',self.separateur)
-        # on splitte la sélection suivant le caractère séparateur
-        liste_chaines = string.split(selection,self.separateur)
-        l_chaines = []
-        for chaine in liste_chaines:
-            chaine = string.strip(chaine)
-            if chaine != '' : l_chaines.append(chaine)
-        return message,l_chaines
-
-    def verif_liste(self, liste):
-        """ Cette méthode effectue des tests sur le nombre d'éléments de la liste
-            et retourne 1 si la liste est correcte, sinon 0 et le message d'erreur
-            correspondant.
-        """
-        message = ""
-        # nombre d'éléments sélectionnés
-        nombre_elements = len(liste)
-        # nombre d'éléments déja dans la liste du panel
-        nombre_in_liste = len(self.panel.Liste_valeurs.get_liste())
-        multiplicite = self.item.GetMultiplicite()
-        if (nombre_elements % multiplicite) != 0:
-            message = "Vous devez sélectionner "+str(multiplicite)+" * n données"
-            return message
-        nombre_valeurs = nombre_elements / multiplicite
-        cardinalite = self.item.GetMinMax()
-        if nombre_valeurs < cardinalite[0]:
-            message = "Vous devez sélectionner au moins "+str(cardinalite[0])+" valeurs"
-            return message
-        if cardinalite[1] != "**" and nombre_valeurs > (long(cardinalite[1])-nombre_in_liste):
-            message = "La liste ne peut avoir plus de "+str(cardinalite[1])+" valeurs"
-            return message
-
-        return message
-
-    def creation_liste_valeurs(self, liste):
-        """ Cette méthode crée et retourne une liste de valeurs du type attendu
-            par le mot-clé. La liste de valeurs est créée à partir de la liste
-            de chaines de caractères transmise.
-        """
-        type_attendu = self.item.GetType()[0]
-        if type_attendu == 'R':
-            return self.convertir(liste, f_conversion= float)
-        elif type_attendu == 'I':
-            return self.convertir(liste, f_conversion= int)
-        elif type_attendu == 'TXM':
-            return self.convertir(liste)
-        else:
-            message = "Seuls les entiers, les réels et les chaines de caractères sont convertis"
-            return message,None
-
-    def convertir(self, liste, f_conversion=None):
-        """ Cette méthode essaie de convertir les éléments de la liste avec la
-            fonction f_conversion si elle existe, et retourne la liste des
-            éléments dans le type voulu en cas de succès, sinon retourne None.
-        """
-        liste_valeurs = []
-        message = ""
-        for chaine in liste:
-            if f_conversion:
-                try:
-                    liste_valeurs.append(f_conversion(chaine))
-                except:
-                    message = "Impossible de convertir "+chaine+" dans le type attendu"
-                    return message,None
-            else:
-                liste_valeurs.append(chaine)
-        return message,liste_valeurs
-
-    def verif_valeurs(self, liste_valeurs):
-        """ Cette méthode teste la validité de tous les éléments de la liste,
-            retourne un message vide s'ils sont valides
-            ou un message non vide au premier élément non valide rencontré
-        """
-        message = ""
-        for valeur in liste_valeurs:
-            test,message = self.item.object.verif_type(valeur)
-            if test == 0: return message
-        return message
-
-    def ajouter_valeurs(self, liste_valeurs):
-        """ Cette méthode ajoute les nouvelles valeurs à la liste existante."""
-        liste = self.panel.Liste_valeurs.get_liste()
-        liste.extend(liste_valeurs)
-        self.panel.Liste_valeurs.put_liste(liste)
-
-class FenetreDeParametre(Fenetre) :
-    def __init__(self,parent,item,appli,texte):
-        self.parent=parent
-        self.appli=appli
-        self.fenetre = Toplevel()
-        self.fenetre.configure(width = 250,height=100)
-        self.fenetre.protocol("WM_DELETE_WINDOW", self.quit)
-        self.fenetre.title("Parametres")
-        self.titre = "Parametres"
-        self.texte = string.replace(texte,'\r\n','\n')
-        fonte=fontes.standardcourier10
-
-        # définition des frames
-        self.frame_texte = Frame(self.fenetre)
-        self.frame_texte.place(relx=0,rely=0,relwidth=1,relheight=0.7)
-        # définition de la zone texte et du scrollbar
-        self.zone_texte = Text(self.frame_texte,font=fonte)
-        self.zone_texte.bind("<Key-Prior>", self.page_up)
-        self.zone_texte.bind("<Key-Next>", self.page_down)
-        self.zone_texte.bind("<Key-Up>", self.unit_up)
-        self.zone_texte.bind("<Key-Down>", self.unit_down)
-        self.scroll_v = Scrollbar (self.frame_texte,command = self.zone_texte.yview)
-        self.scroll_v.pack(side='right',fill ='y')
-        self.zone_texte.pack(side='top',fill='both',expand=1,padx=5,pady=10)
-        self.zone_texte.configure(yscrollcommand=self.scroll_v.set)
-        # affichage du texte
-        self.affiche_texte(self.texte)
-        self.zone_texte.config(state="disabled")
-
-        # définition des boutons
-        self.frame_boutons = Frame(self.fenetre)
-        self.frame_boutons.place(relheight=0.3,relx=0,rely=0.65,relwidth=1.)
-        self.label1 = Label(self.frame_boutons,text="surligner la")
-        self.label2 = Label(self.frame_boutons,text="ligne entière")
-        self.label1.place(relx=0.1,rely=0)
-        self.label2.place(relx=0.1,rely=0.5)
-        self.but_quit = Button(self.frame_boutons,text = "Fermer",command=self.quit)
-        self.but_save = Button(self.frame_boutons,text = "Choisir",command = self.Choisir)
-        self.but_save.place(relx=0.6,rely=0,relheight=1)
-        self.but_quit.place(relx=0.8,rely=0,relheight=1)
-
-
-    def Choisir(self):
-        try:
-            selection=self.zone_texte.selection_get()
-        except:
-            showerror("Pas de donnée sélectionnée",
-                       "Selectionner un parametre")
-        l_param = ""
-        for param in selection.splitlines():
-            nomparam=param[0:param.find("=")-1]
-            if nomparam != '' : 
-                l_param=l_param+nomparam+','
-        self.parent.entry.delete(0,Tkinter.END)
-        self.parent.entry.insert(0,l_param[0:-1])
-        self.parent.valid_valeur()
-        self.quit()
-
-class Formulaire:
-    """
-    Cette classe permet de créer une boîte Dialog dans laquelle
-    on affiche un formulaire à remplir par l'utilisateur
-    """
-    def __init__(self,fen_pere,obj_pere=None,titre="",texte="",items=(),mode='query',commande=None):
-        self.resultat=0
-        if items in ((),[]) : return
-        self.items = items
-        self.titre = titre
-        self.texte = texte
-        self.fen_pere = fen_pere
-        self.obj_pere = obj_pere
-        self.mode= mode
-        self.command = commande
-        self.display()
-
-    def display(self):
-        self.init_validateurs()
-        self.init_fenetre()
-        self.init_texte()
-        self.init_items_formulaire()
-        self.fenetre.activate(geometry='centerscreenalways')
-
-    def init_validateurs(self):
-        """
-        Crée le dictionnaire des validateurs des objets reconnus par le formulaire
-        """
-        self.d_validateurs = {}
-        self.d_validateurs['rep']  = self.repvalidator
-        self.d_validateurs['file'] = self.filevalidator
-        self.d_validateurs['cata']= self.catavalidator
-        self.d_validateurs['mot']= self.motvalidator
-        self.d_validateurs['mot2']= self.mot2validator
-        self.d_validateurs['mot3']= self.mot3validator
-        self.d_validateurs['mot4']= self.mot4validator
-        
-    def init_fenetre(self):
-        """
-        Crée la fenêtre Dialog
-        """
-        if self.mode == 'query':
-            buttons=('Valider','Annuler')
-            defaultbutton = 'Valider'
-        elif self.mode == 'display':
-            if self.command :
-                buttons=(self.command[0],'OK')
-                defaultbutton = 'OK'
-            else:
-                buttons=('OK')
-                defaultbutton = 'OK'
-        self.fenetre = Pmw.Dialog(self.fen_pere,
-                                  buttons=buttons,
-                                  defaultbutton = defaultbutton,
-                                  title = self.titre,
-                                  command = self.execute)
-        self.fenetre.withdraw()
-        
-    def init_texte(self):
-        """
-        Crée le label qui affiche le texte à l'intérieur du panneau
-        """
-        fonte=fontes.standard
-        fr_texte = Frame(self.fenetre.interior(),height=60)
-        fr_texte.pack(side='top',fill='x',expand=1)
-        Label(fr_texte,text = self.texte, font=fonte).place(relx=0.5,rely=0.5,anchor='center')
-
-    def init_items_formulaire(self):
-        """
-        Crée et affiche les items dans la boîte de dialogue
-        """
-        self.radiobut = 0
-        self.widgets = []
-        self.item_widgets = {}
-        length_maxi = 0
-        for item in self.items:
-            if len(item[0])>length_maxi : length_maxi = len(item[0])
-        window = self.fenetre.interior()
-        for item in self.items :
-            if len(item) == 4 :
-               label,nature,nom_var,defaut = item
-               chaine="Yes" 
-               chaine2="No"
-            else :
-               label,nature,nom_var,defaut,chaine,chaine2 = item
-          
-            # création de la frame
-            fr_item = Frame(window,height=40,width=700)
-            fr_item.pack(side='top',fill='x',expand=1)
-            # création du label
-            Label(fr_item,text = label).place(relx=0.05,rely=0.4)
-            if nature in ('rep','file','cata','mot','mot2','mot3','mot4'):
-                # création de l'entry
-                e_item = Entry(fr_item) 
-                e_item.place(relx=0.5,rely=0.4,relwidth=0.45)
-                self.widgets.append(e_item)
-                self.item_widgets[item] = e_item
-                if defaut : e_item.insert(0,str(defaut))
-            elif nature == 'YesNo':
-                # création de la StringVar
-                var = StringVar()
-                setattr(self,'item_'+nom_var,var)
-                var.set(defaut)
-                # création du radiobouton
-                rb1 = Radiobutton(fr_item,text=chaine,variable=var,value='OUI')
-                rb2 = Radiobutton(fr_item,text=chaine2,variable=var,value='NON')
-                rb1.place(relx=0.65,rely=0.5,anchor='center')
-                rb2.place(relx=0.80,rely=0.5,anchor='center')
-                self.widgets.append((rb1,rb2))
-                self.item_widgets[item] = var
-        # détermination de la méthode à appliquer sur les boutons
-        if self.mode == 'query':
-            function = self.active
-        elif self.mode == 'display':
-            function = self.inactive
-        else:
-            return
-        # on applique la méthode sur les boutons (activation ou désactivation)  
-        for widget in self.widgets :
-            if type(widget) == types.TupleType:
-                for widg in widget :
-                    apply(function,(widg,),{})
-            else:
-                apply(function,(widget,),{})
-
-    def active(self,widget):
-        """
-        Active le widget passé en argument
-        """
-        widget.configure(state='normal',bg='white')
-
-    def inactive(self,widget):
-        """
-        Inactive le widget passé en argument
-        """
-        if not isinstance(widget,Radiobutton) :
-            widget.configure(state='disabled',bg='gray95')
-        else :
-            widget.configure(state='disabled')
-
-# --------------------------------------------------------------------------------
-#       Validateurs des noms de répertoire, de fichiers et de catalogues
-# -------------------------------------------------------------------------------
-
-    def motvalidator(self,text):
-        text2="("+text+")"
-        return self.motlongueurvalidator(text2,1) 
-
-    def mot2validator(self,text):
-        return self.motlongueurvalidator(text,2) 
-
-    def mot3validator(self,text):
-        return self.motlongueurvalidator(text,3) 
-
-    def mot4validator(self,text):
-        return self.motlongueurvalidator(text,4) 
-
-    def motlongueurvalidator(self,text,longueur):
-        try :
-          if ((text[0] != "(") or (text[-1] != ")")) : return 0
-          if len(text.split(",")) != longueur : return 0
-          return 1
-        except :
-          return 0
-
-    def repvalidator(self,text):
-        """
-        Teste si text peut faire référence à un répertoire ou non
-        Retourne 1 si valide, 0 sinon
-        """
-        return os.path.isdir(text),'Répertoire introuvable : %s' %text
-
-    def filevalidator(self,text):
-        """
-        Teste si text peut faire référence à un fichier ou non
-        Retourne 1 si valide, 0 sinon
-        """
-        return os.path.isfile(text),'Fichier introuvable : %s' %text
-
-    def catavalidator(self,text):
-        """
-        Teste si  text est un chemin d'accès valide à un catalogue
-        Retourne 1 si valide, 0 sinon
-        """
-        return os.path.isfile(text),"Catalogue introuvable : %s" %text
-
-# --------------------------------------------------------------------------------
-#       Méthodes callbacks des boutons et de fin
-# --------------------------------------------------------------------------------
-        
-    def execute(self,txt):
-        """
-        Cette commande est activée à chaque clic sur un bouton.
-        Redirige l'action sur la bonne méthode en fonction du bouton activé
-        """
-        if txt == 'Valider':
-            self.fini()
-        elif txt in ('OK','Annuler'):
-            self.quit()
-        elif txt == 'Modifier':
-            self.resultat = apply(self.command[1],(),{})
-            self.fenetre.destroy()
-        else :
-            print "Nom de bouton inconnu"
-            self.quit()
-
-    def fini(self):
-        """
-        Commande qui termine le panneau et sauvegarde les nouvelles options
-        dans l'objet resultat (dictionnaire)
-        """
-        dico={}
-        for item,widget in self.item_widgets.items():
-            nom_var = item[2]
-            type_var = item[1]
-            valeur = widget.get()
-            if self.d_validateurs.has_key(type_var):
-                test = self.d_validateurs[type_var](valeur)
-                if not test :
-                    # une entrée n'est pas valide --> on la met en surbrillance et on quitte la méthode
-                    # sans tuer la fenêtre bien sûr
-                    widget.selection_range(0,END)
-                    return
-            dico[nom_var] = valeur
-        self.fenetre.destroy()    
-        self.resultat=dico
-        
-    def quit(self):
-        self.fenetre.destroy()
-        self.resultat=None
-        
-class ListeChoix :
-    """ Cette classe est utilisée pour afficher une liste de choix passée en paramètre
-        en passant les commandes à lancer suivant différents bindings """
-    def __init__(self,parent,page,liste,liste_commandes=[],liste_marques =[],active ='oui',filtre='non',titre='',
-                 optionReturn=None, fonte_titre=fontes.standard_gras_souligne):
-        self.parent = parent
-        self.page = page
-        self.liste = liste
-        self.dico_labels={}
-        self.dico_mots={}
-        self.nBlabel = 0
-        self.dico_place={}
-       self.dico_mots={}
-        self.selection = None
-        self.liste_commandes = liste_commandes
-        self.liste_marques = liste_marques
-        self.arg_selected=''
-        self.active = active
-        self.titre = titre
-        self.filtre = filtre
-        self.optionReturn = optionReturn
-        self.fonte_titre=fonte_titre
-        self.init()
-
-    def init(self):        
-        self.make_label_titre()
-        self.make_entry_filtre()
-        self.make_text_box()
-        try:
-            self.entry.component('entry').focus()
-        except:
-            pass
-
-    def make_label_titre(self):
-        """ Crée le label correspondant au titre """
-        if self.titre == '' : return
-        self.label = Label(self.page,
-                           text = self.titre,
-                           font = self.fonte_titre)
-        self.label.pack(side='top',pady=2)
-        
-    def make_entry_filtre(self):
-        """ Crée l'entry permettant à l'utilisateur d'entrer un filtre de sélection dans la liste """
-        if self.filtre != 'oui' : return
-        self.entry = Pmw.EntryField(self.page,labelpos='w',
-                                    label_text="Filtre :",
-                                    command=self.entry_changed)
-        self.entry.pack(side='top',pady=2)
-        
-    def make_text_box(self):
-        """ Crée la fenêtre texte dans laquelle sera affichée la liste """
-        self.MCbox = Text (self.page,relief='sunken',bg='gray95',bd=2)
-        self.MCscroll = Scrollbar (self.page,command = self.MCbox.yview)
-        self.MCscroll.pack(side='right',fill ='y',pady=2)
-        self.MCbox.pack(fill='y',expand=1,padx=2,pady=2)
-        self.MCbox.configure(yscrollcommand=self.MCscroll.set)
-
-
-    def affiche_liste(self):
-        """ Affiche la liste dans la fenêtre"""
-        liste_labels=[]
-        self.MCbox.config(state=NORMAL)
-        self.MCbox.delete(1.0,END)
-        self.nBlabel = 0
-        self.dico_place={}
-        for objet in self.liste :
-          if type(objet) == types.InstanceType:
-              try:
-                  mot = objet.nom
-              except:
-                  mot = str(objet)
-          elif type(objet) in (types.StringType,types.IntType):
-              mot = objet
-          elif type(objet) == types.FloatType :
-              mot = self.parent.get_valeur_texte(objet)
-              if mot == "" :
-                 mot = str(objet)
-          elif type(objet) == types.TupleType :
-              mot="("
-              premier=1
-              for val in objet:
-                 if (not premier):
-                   mot=mot+"," 
-                 else:
-                   premier=0
-                 valtexte = self.parent.get_valeur_texte(val)
-                 if valtexte != "" :
-                    mot=mot+valtexte
-                 else:
-                    mot=mot+str(val)
-              mot=mot+")"
-          else:
-              mot=`objet`
-          label = Label(self.MCbox,
-                        text = mot,
-                        fg = 'black',bg = 'gray95',justify = 'left')
-          self.dico_labels[mot]=label
-          self.dico_place[mot]=self.nBlabel
-         self.dico_mots[label]=mot
-          self.nBlabel=self.nBlabel+1
-          liste_labels.append(label)
-          self.MCbox.window_create(END,
-                                   window=label,
-                                   stretch = 1)
-          self.MCbox.insert(END,'\n')
-          if self.optionReturn != None :
-              label.bind("<Return>",lambda e,s=self,c=self.liste_commandes[2][1],x=objet,l=label : s.chooseitemsurligne(x,l,c))
-              label.bind("<KP_Enter>",lambda e,s=self,c=self.liste_commandes[2][1],x=objet,l=label : s.chooseitemsurligne(x,l,c))
-          label.bind("<Key-Right>",lambda e,s=self,x=objet,l=label : s.selectNextItem(x,l))
-          label.bind("<Key-Down>",lambda e, s=self,x=objet,l=label : s.selectNextItem(x,l))
-          label.bind("<Key-Left>" ,lambda e,s=self,x=objet,l=label  : s.selectPrevItem(x,l))
-          label.bind("<Key-Up>" ,lambda e,s=self,x=objet,l=label  : s.selectPrevItem(x,l))
-          if self.active == 'oui':
-              label.bind(self.liste_commandes[0][0],lambda e,s=self,c=self.liste_commandes[0][1],x=objet,l=label : s.selectitem(x,l,c))
-              label.bind(self.liste_commandes[1][0],lambda e,s=self,c=self.liste_commandes[1][1],x=objet,l=label : s.deselectitem(l,x,c))
-              label.bind(self.liste_commandes[2][0],lambda e,s=self,c=self.liste_commandes[2][1],x=objet,l=label : s.chooseitem(x,l,c))
-
-        for marque in self.liste_marques:
-           try:
-              self.markitem(liste_labels[marque])
-           except:
-              pass
-
-        self.MCbox.config(state=DISABLED)
-        self.selection = None
-        self.dontselect=0
-        for event,callback in self.liste_commandes:
-            if event == "<Enter>":
-               self.selection=None,None,callback
-               break
-
-    def clear_marque(self):
-        try:
-          self.dico_labels[self.arg_selected].configure(bg='gray95',fg='black')
-          self.arg_selected = ''
-        except :
-          pass
-
-    def surligne(self,marque):
-        try :
-           self.highlightitem(self.dico_labels[marque])
-           self.arg_selected = marque
-        except:
-           pass
-
-    def chooseitemsurligne(self,mot,label,commande):
-        """ Active la méthode de choix passée en argument"""
-        try:
-           mot=self.arg_selected
-           commande(mot)
-        except AsException,e:
-           raison=str(e)
-           showerror(raison.split('\n')[0],raison)
-
-    def chooseitem(self,mot,label,commande):
-        """ Active la méthode de choix passée en argument"""
-        try:
-           commande(mot)
-        except AsException,e:
-           raison=str(e)
-           showerror(raison.split('\n')[0],raison)
-
-    def afficheMot(self,mot):
-        """ Pour contourner le bug sur l index 
-            on commence par la methode dite normale     
-            puis par la methode de contournement     
-            puis rien du tout 
-        """
-        try:
-             labelsuivant=self.dico_labels[mot]
-             index = self.MCbox.index(labelsuivant)
-             self.MCbox.see(index)
-        except :
-             posmot=self.dico_place[mot]
-             totale=self.nBlabel + 0.0
-             self.MCbox.yview_moveto(posmot/totale)
-
-    def selectNextItem(self,mot,label):
-        index=self.liste.index(mot)
-        indexsuivant=index+1
-        if indexsuivant > len(self.liste) -1:
-           indexsuivant=0
-        motsuivant=self.liste[indexsuivant]
-        labelsuivant=self.dico_labels[motsuivant]
-        self.afficheMot(motsuivant)
-        self.selectthis(motsuivant,labelsuivant,self.selection[2],)
-        self.dontselect=1
-           
-    def selectPrevItem(self,mot,label):
-        index=self.liste.index(mot)
-        indexprec=index-1
-        motprec=self.liste[indexprec]
-        labelprec=self.dico_labels[motprec]
-        self.afficheMot(motprec)
-        self.selectthis(motprec,labelprec,self.selection[2],)
-        self.dontselect=1
-        
-    def selectthis(self,mot,label,commande) :
-        self.clear_marque()
-        if self.selection != None :
-            self.deselectitem(self.selection[1],self.selection[0],self.selection[2],)
-        self.highlightitem(label)
-        self.selection = (mot,label,commande)
-        self.arg_selected = mot
-        if commande : commande(mot)
-
-    def selectitem(self,mot,label,commande) :
-        """ Met l'item sélectionné (représenté par son label) en surbrillance
-            et lance la commande associée au double-clic"""
-        if self.dontselect:
-           self.dontselect=0
-           return
-        self.selectthis(mot,label,commande)
-
-    def highlightitem(self,label) :
-        """ Met l'item représenté par son label en surbrillance """
-        label.focus_set()
-        label.configure(bg='#00008b',fg='white')
-        
-    def markitem(self,label):
-        """ Met l'item (représenté par son label) en rouge """
-        label.configure(bg='gray95',fg='red')
-        
-    def deselectitem(self,label,mot='',commande=None) :
-        """ Remet l'item (représenté par son label) en noir"""
-        if label:label.configure(bg='gray95',fg='black')
-        self.arg_selected = ''
-        if commande and mot : commande(mot)
-
-    def cherche_selected_item(self):
-        try :
-           index=self.MCbox.index(self.selection[1])
-           lign,col=map(int,string.split(index,'.'))
-        except :
-          label=self.dico_labels[self.arg_selected]
-           mot=self.dico_mots[label] 
-           lign=self.dico_place[mot]+1
-        return lign
-
-    def remove_selected_item(self):
-        try :
-           index=self.MCbox.index(self.selection[1])
-           lign,col=map(int,string.split(index,'.'))
-        except :
-          label=self.dico_labels[self.arg_selected]
-           mot=self.dico_mots[label] 
-           lign=self.dico_place[mot]+1
-        del self.liste[lign-1]
-        self.affiche_liste()
-
-    def entry_changed(self,event=None):
-        """ Cette méthode est invoquée chaque fois que l'utilisateur modifie le contenu
-        de l'entry et frappe <Return>"""
-        if self.arg_selected != '' : self.deselectitem(self.dico_labels[self.arg_selected])
-        filtre = self.entry.get()+"*"
-        FILTRE = string.upper(filtre)
-        self.dontselect=0
-        for arg in self.liste :
-            if fnmatch.fnmatch(arg,filtre) or fnmatch.fnmatch(arg,FILTRE) :
-                label=self.dico_labels[arg]
-                self.afficheMot(arg)
-                self.selectitem(arg,label,self.selection[2])
-                break
-
-        #try :
-          #self.dico_labels[self.arg_selected].focus_set()
-        #except :
-          #pass
-
-
-    # PN attention à la gestion des paramétres
-    # cela retourne H = 1 , et ni H, ni 1
-    #            print repr(val)
-    #            print val.__class__.__name__
-    def get_liste(self):
-        l=[]
-        for val in self.liste:
-#            try:
-#                v = eval(val)
-#                    l.append(v)
-#            except:
-                l.append(val)
-        return l
-    
-    def put_liste(self,liste):
-        self.liste = liste
-        self.affiche_liste()
-
-class Affichage :
-  """ Cette classe permet d'afficher au lancement d'EFICAS le message
-      d'attente et la barre de progression"""
-  def __init__(self,master,message,barre ='oui'):
-      from Tools.foztools.foztools import Slider
-      fonte=fontes.standard12_gras
-      self.master=master
-      self.frame = Frame(self.master)
-      self.frame.pack(expand=1,fill='both')
-      self.mess = Label(self.frame,text=message,justify='center',
-                        bd=2,relief='groove',font=fonte)
-      self.mess.pack(in_ = self.frame,side='top',expand=1,fill='both')
-      self.progress = Slider(self.frame,value=0,max=100,orientation='horizontal',
-                             fillColor='#00008b',width=200,height=30,
-                             background='white',labelColor='red')
-      if barre == 'oui':
-          self.progress.frame.pack(in_=self.frame,side='top')
-      self.master.update()
-      if barre == 'oui':
-          self.progress.frame.after(1000,self.update)
-
-  def configure(self,**options):
-      if options.has_key('message'):
-          self.mess.configure(text=options['message'])
-      if options.has_key('barre'):
-          if options['barre'] == 'oui' :
-              self.progress.frame.pack(in_=self.frame,side='top')
-          elif options['barre'] == 'non' :
-              self.progress.frame.pack_forget()
-      self.master.update_idletasks()
-      
-  def quit(self):
-      self.frame.destroy()
-      self.master.update()
-
-  def update(self,event=None):
-      """ Permet de faire avancer la barre de progression """
-      try :
-          bar=self.progress
-          bar.value = bar.value+self.increment
-          bar.update()
-          self.master.after(100,self.update)
-      except:
-          pass
-
-  def configure_barre(self,nb):
-      """ Calcule l'incrément de progression de la barre en fonction
-          du nombre d'opérations à effectuer afin que le compteur
-          soit à 100% à la fin des opérations"""
-      self.increment = 100./nb
-      self.progress.update()
-
-class Ask_Format_Fichier :
-    """
-    Cette classe permet de créer une fenêtre Toplevel dans laquelle
-    on propose le choix du format de fichier de commandes à ouvrir
-    """
-    def __init__(self,appli):
-        self.fenetre = Toplevel()
-        self.fenetre.configure(width = 250,height=150)
-        self.fenetre.protocol("WM_DELETE_WINDOW", self.quit)
-        self.fenetre.title("Choix du format du fichier de commandes")
-        # définition des frames
-        self.frame_texte = Frame(self.fenetre)
-        self.frame_radioboutons = Frame(self.fenetre)
-        self.frame_bouton_ok = Frame(self.fenetre)
-        self.frame_texte.place(relx=0,rely=0,relwidth=1,relheight=0.3)
-        self.frame_radioboutons.place(relheight=0.5,relx=0,rely=0.3,relwidth=1.)
-        self.frame_bouton_ok.place(relheight=0.2,relx=0,rely=0.8,relwidth=1.)
-        # définition de la zone texte et du scrollbar
-        zone_texte = Label(self.frame_texte,text = "Format du fichier à ouvrir :")
-        zone_texte.pack(side='top',fill='both',expand=1,padx=5,pady=10)
-        # définition des radioboutons
-        Radiobutton(self.frame_radioboutons,text='Format Aster (Code_Aster --> v5)',
-                    variable=appli.format_fichier,value='Aster').pack(anchor='n')
-        Radiobutton(self.frame_radioboutons,text='Format Python (Code_Aster v6-->)',
-                    variable=appli.format_fichier,value='Python').pack(anchor='n')
-        # création du bouton OK
-        Button(self.frame_bouton_ok,text='OK',command=self.quit).pack(anchor='n')
-        # centrage de la fenêtre
-        centerwindow(self.fenetre)
-
-    def quit(self):
-        self.fenetre.destroy()
-
-class BARRE_K2000(Toplevel):
-    def __init__(self,master=None,text = ""):
-        Toplevel.__init__(self,master,relief='groove')
-        self.master.iconify()
-        self.geometry("250x100+0+0")
-        self.protocol("WM_DELETE_WINDOW",self.quit)
-        # frame principale dans self (= Toplevel)
-        self.frame = Frame(self)
-        self.frame.place(relwidth=1,relheight=1)
-        # frame contenant le texte à afficher 
-        self.frame_text = Frame(self.frame)
-        self.frame_text.place(relwidth=1,relheight=0.75,rely=0)
-        # frame contenant le canvas de la barre
-        self.frame_canv = Frame(self.frame)
-        self.frame_canv.place(relwidth=1,relheight=0.25,rely=0.75)
-        # canvas dans lequel sera affichée la barre K2000
-        self.canvas = Canvas(self.frame_canv)
-        self.canvas.place(relx=0.5,rely=0.5,relheight=0.8,relwidth=0.8,anchor='center')
-        # on affiche le texte et la barre
-        self.build_text(text)
-        self.build_batons()
-        #self.overrideredirect(1)
-        # on active la barre ...
-        self.master.after(1000,self.launch)
-        # on centre la fenêtre
-        centerwindow(self)
-        self.focus()
-
-    def build_text(self,text):
-        """
-        Affichage de text dans frame_text
-        """
-        self.texte_var = StringVar()
-        self.texte_var.set(text)
-        Label(self.frame_text,textvariable=self.texte_var).place(relx=0.5,rely=0.5,anchor='center')
-        
-    def build_batons(self):
-        """
-        Construit la suite de bâtons dans le canvas
-        """
-        self.l_batons=[]
-        self.black = -1
-        self.sens = 'D'
-        self.quit = 0
-        for i in range(0,40):
-            id = self.canvas.create_rectangle(i*5,0,(i+1)*5,20,fill='gray90',outline='')
-            self.l_batons.append(id)
-
-    def launch(self):
-        """
-        Active la barre K2000 en affichant les bâtons avec des couleurs en dégradé
-        """
-        if self.quit == 1 :
-            self.destroy()
-            self.master.deiconify()
-            return
-        if self.sens == 'D':
-            self.black = self.black+1
-            l_bat = self.l_batons[0:self.black+1]
-            l_bat.reverse()
-        elif self.sens == 'G':
-            self.black = self.black-1
-            l_bat = self.l_batons[self.black:]
-        i=0
-        for bat in l_bat :
-            num_color = 5+i*10
-            if num_color < 10 : color = 'black'
-            elif num_color > 90 : color = 'white'
-            else: color = 'gray'+`num_color`
-            self.canvas.itemconfigure(bat,fill=color)
-            i=i+1
-        if self.black == len(self.l_batons) :
-            self.sens = 'G'
-        if self.black == 0 and self.sens == 'G':self.sens = 'D'
-        self.after(80,self.launch)
-
-    def update_text(self,new_text):
-        """
-        Remplace le texte affiché par new_text
-        """
-        self.texte_var.set(new_text)
-        
-    def quit(self):
-        self.quit = 1        
-
-class ListeChoixParGroupes(ListeChoix) :
-    """ 
-        Cette classe est utilisée pour afficher une liste de commandes classées par
-        groupes. L'utilisateur peut réaliser des actions de selection
-        qui déclenchent des actions spécifiées par les bindings contenus dans liste_commandes
-        Exemple de binding:
-           liste_commandes = (("<Enter>",self.selectCmd),
-                              ("<Leave>",self.deselectCmd),
-                              ("<Double-Button-1>",self.defCmd))
-        Il s'agit d'une liste de doublets dont le premier element est un evenement et le 
-        deuxieme un callback a appeler sur l'evenement en question.
-
-    """
-    def __init__(self,parent,page,liste_groupes,dict_groupes,liste_commandes=[],liste_marques =[],
-                      active ='oui',filtre='non',titre='',optionReturn=None,fonte_titre=fontes.standard_gras_souligne):
-        self.parent = parent
-        self.page = page
-        self.liste_groupes = liste_groupes
-        self.dict_groupes = dict_groupes
-        self.dico_labels={}
-        self.selection = None
-        self.liste_commandes = liste_commandes
-        self.liste_marques = liste_marques
-        self.arg_selected=''
-        self.active = active
-        self.titre = titre
-        self.filtre = filtre
-        self.optionReturn = optionReturn
-        self.fonte_titre=fonte_titre
-        self.init()
-
-    def affiche_liste(self):
-        """ Affiche la liste dans la fenêtre"""
-        liste_labels=[]
-       self.dico_mots={}
-        self.MCbox.config(state=NORMAL)
-        self.MCbox.delete(1.0,END)
-        for grp in self.liste_groupes:
-           # On itère sur les groupes
-           if grp == "CACHE":continue
-           liste_commandes=self.dict_groupes[grp]
-           text="GROUPE<<<<<<<< "+grp+" "
-           text=text+">"*max(0,30-len(text))
-           label = Label(self.MCbox,
-                        text = text,
-                        fg = 'black',bg = 'gray95',justify = 'left')
-           # On stocke la relation entre le nom de la commande et le label
-           self.dico_labels[grp]=label
-           liste_labels.append(label)
-           self.MCbox.window_create(END,
-                                   window=label,
-                                   stretch = 1)
-           self.MCbox.insert(END,'\n')
-           for cmd in liste_commandes:
-              label = Label(self.MCbox,
-                        text = cmd,
-                        fg = 'black',bg = 'gray95',justify = 'left')
-              # On stocke la relation entre le nom de la commande et le label
-              self.dico_labels[cmd]=label
-             self.dico_mots[label]=cmd
-              self.MCbox.window_create(END,
-                                   window=label,
-                                   stretch = 1)
-              self.MCbox.insert(END,'\n')
-
-              def null(*tp,**args): return
-
-              if self.active == 'oui':
-                  # Traitement par defaut des evenements
-                  label.bind("<Enter>",lambda e,s=self,c=null,x=cmd,l=label: s.selectitem(x,l,c))
-                  label.bind("<Leave>",lambda e,s=self,c=null,x=cmd,l=label: s.deselectitem(l,x,c))
-                  label.bind("<Double-Button-1>",lambda e,s=self,c=null,x=cmd,l=label: s.chooseitem(x,l,c))
-                  label.bind("<Return>",lambda e,s=self,c=null,x=cmd,l=label: s.chooseitem(x,l,c))
-                  label.bind("<KP_Enter>",lambda e,s=self,c=null,x=cmd,l=label: s.chooseitem(x,l,c))
-                  label.bind("<Key-Right>",lambda e,s=self,c=null,x=cmd,l=label,gr=grp: s.selectNextItem(x,l,c,gr,x))
-                  label.bind("<Key-Down>",lambda e,s=self,c=null,x=cmd,l=label,gr=grp: s.selectNextItem(x,l,c,gr,x))
-                  label.bind("<Key-Left>",lambda e,s=self,c=null,x=cmd,l=label,gr=grp: s.selectPrevItem(x,l,c,gr,x))
-                  label.bind("<Key-Up>",lambda e,s=self,c=null,x=cmd,l=label,gr=grp: s.selectPrevItem(x,l,c,gr,x))
-
-                  # Si des callbacks sont definis on les utilise
-                  for event,callback in self.liste_commandes:
-                      if event == "<Enter>":
-                         label.bind("<Enter>",lambda e,s=self,c=callback,x=cmd,l=label: s.selectitem(x,l,c))
-                      elif event == "<Leave>":
-                         label.bind("<Leave>",lambda e,s=self,c=callback,x=cmd,l=label: s.deselectitem(l,x,c))
-                      elif event == "<Double-Button-1>":
-                         label.bind("<Double-Button-1>",lambda e,s=self,c=callback,x=cmd,l=label: s.chooseitem(x,l,c))
-                      elif event == "<Return>":
-                         label.bind("<Return>",lambda e,s=self,c=callback,x=cmd,l=label: s.chooseitem(x,l,c))
-                      elif event == "<KP_Enter>":
-                         label.bind("<KP_Enter>",lambda e,s=self,c=callback,x=cmd,l=label: s.chooseitem(x,l,c))
-                      elif event == "<Key-Right>":
-                         label.bind("<Key-Right>",lambda e,s=self,c=callback,x=cmd,l=label,gr=grp:s.selectNextItem(x,l,c,gr,x))
-                      elif event == "<Key-Down>":
-                         label.bind("<Key-Down>",lambda e,s=self,c=callback,x=cmd,l=label,gr=grp:s.selectNextItem(x,l,c,gr,x))
-                      elif event == "<Key-Left>":
-                         label.bind("<Key-Left>",lambda e,s=self,c=callback,x=cmd,l=label,gr=grp:s.selectPrevItem(x,l,c,gr,x))
-                      elif event == "<Key-Up>":
-                         label.bind("<Key-Up>",lambda e,s=self,c=callback,x=cmd,l=label,gr=grp:s.selectPrevItem(x,l,c,gr,x))
-                      else:
-                         label.bind(event,lambda e,s=self,c=callback,x=cmd,l=label: c())
-
-        for marque in self.liste_marques:
-           try:
-              self.markitem(liste_labels[marque])
-           except:
-              pass
-
-        self.MCbox.config(state=DISABLED)
-        self.selection = None
-        self.dontselect=0
-        for event,callback in self.liste_commandes:
-            if event == "<Enter>":
-               self.selection=None,None,callback
-               break
-
-    def selectPrevItem(self,mot,label,callback,group,cmd):
-        g=self.liste_groupes.index(group)
-        liste_commandes=self.dict_groupes[group]
-        c=liste_commandes.index(cmd)
-        if c > 0:
-           co=liste_commandes[c-1]
-        else:
-           # debut de liste. On passe au groupe precedent
-           if g > 0:
-              gr=self.liste_groupes[g-1]
-              co=self.dict_groupes[gr][-1]
-           else:
-              # debut des groupes. On ne fait rien
-              return
-        # On a trouve l'item precedent
-        labelsuivant=self.dico_labels[co]
-        index = self.MCbox.index(labelsuivant)
-        self.MCbox.see(index)
-        self.selectthis(co,labelsuivant,self.selection[2],)
-        self.dontselect=1
-
-    def selectNextItem(self,mot,label,callback,group,cmd):
-        g=self.liste_groupes.index(group)
-        liste_commandes=self.dict_groupes[group]
-        c=liste_commandes.index(cmd)
-        try:
-           co=liste_commandes[c+1]
-        except:
-           # fin de liste. On passe au groupe suivant
-           try:
-              gr=self.liste_groupes[g+1]
-              co=self.dict_groupes[gr][0]
-           except:
-              # fin des groupes. On ne fait rien
-              return
-        # On a trouve l'item suivant
-        labelsuivant=self.dico_labels[co]
-        index = self.MCbox.index(labelsuivant)
-        self.MCbox.see(index)
-        self.selectthis(co,labelsuivant,self.selection[2],)
-        self.dontselect=1
-
-    def entry_changed(self,event=None):
-        """ 
-            Cette méthode est invoquée chaque fois que l'utilisateur modifie le contenu
-            de l'entry et frappe <Return>
-        """
-        if self.arg_selected != '' : self.deselectitem(self.dico_labels[self.arg_selected])
-
-        filtre = self.entry.get()+"*"
-        FILTRE = string.upper(filtre)
-        #
-        # On cherche d'abord dans les noms de groupe
-        # puis dans les noms de commande groupe par groupe
-        #
-        for grp in self.liste_groupes:
-            if fnmatch.fnmatch(grp,filtre) or fnmatch.fnmatch(grp,FILTRE) :
-                cmd=self.dict_groupes[grp][0]
-                label=self.dico_labels[cmd]
-                index = self.MCbox.index(label)
-                self.MCbox.see(index)
-                self.selectitem(cmd,label,self.selection[2])
-                # On a trouve un groupe on arrete la recherche
-                return
-
-        for grp in self.liste_groupes:
-           for cmd in self.dict_groupes[grp] :
-              if fnmatch.fnmatch(cmd,filtre) or fnmatch.fnmatch(cmd,FILTRE) :
-                 label=self.dico_labels[cmd]
-                 index = self.MCbox.index(label)
-                 self.MCbox.see(index)
-                 self.selectitem(cmd,label,self.selection[2])
-                 # On a trouve une commande  on arrete la recherche
-                 return
-
index a51c5fffec6feb1de5e99aeaa83c89a158684555..2db151300f1a22ba2f30b15f2306e7604543dec7 100644 (file)
@@ -25,7 +25,7 @@
 import traceback
 
 from Noyau import N_OBJECT
-import prefs
+from Aster import prefs
 
 class ETAPE_NIVEAU(N_OBJECT.OBJECT):
 
index d228980c69dcb4137098bf35c5323f898ba7a26e..79044d6b13a7701cb1afc094fbe7550fffdea37e 100644 (file)
@@ -110,21 +110,6 @@ class FORM_ETAPE(MACRO_ETAPE):
         test = 1
         arguments = arguments[1:-1] # on enlève les parenthèses ouvrante et fermante
         l_arguments = string.split(arguments,',')
-        #for argument in l_arguments:
-        #    argument = string.strip(argument)
-        #    try:
-        #        nom=argument
-        #        typ,nom = string.split(argument,':')
-        #        #pas de vérification sur le nom de l'argument
-        #        #vérification du type de l'argument
-        #        typ = string.strip(typ)
-        #        if typ not in self.l_types_autorises :
-        #            test = 0
-        #            erreur = erreur + "Le type "+typ+" n'est pas un type permis pour "+nom+'\n'
-        #    except:
-        #        # l'argument ne respecte pas la syntaxe : typ_arg : nom_arg
-        #        test = 0
-        #        erreur = erreur+"Syntaxe argument non valide : "+argument+'\n'
         return test,erreur
 
     def verif_corps(self,corps=None,arguments=None):
diff --git a/InterfaceQT/__init__.py b/InterfaceQT/__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/InterfaceQT/browser.py b/InterfaceQT/browser.py
new file mode 100644 (file)
index 0000000..99e055b
--- /dev/null
@@ -0,0 +1,474 @@
+# -*- coding: utf-8 -*-
+import os,sys,string,re,types,traceback
+
+from qt import *
+
+
+from InterfaceQT 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('Name'))
+        self.addColumn(self.trUtf8('Value'))
+                
+        self.setMinimumSize(QSize(400,500))
+        self.connect(self,SIGNAL('contextMenuRequested(QListViewItem *, const QPoint &, int)'),
+                     self.handleContextMenu)
+
+        self.connect(self, SIGNAL("onItem ( QListViewItem * ) "), self.handleOnItem)
+        
+        
+    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 handleOnItem(self,  item ):
+        fr = item.item.get_fr()
+        if self.editor:
+            self.editor.affiche_infos(fr)
+        
+    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 """
+        print 'TREE update'
+        for child in self.children:
+            child.update()
+            
+    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 'TREE update_valid'
+        
+# 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.node)
+            commande,nom = self.item.uncomment()
+            self.parent.children[pos].select()
+        except Exception,e:
+            QMessageBox.critical( self.parent, "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()
+        self.update_node_valid()
+        self.parent.update_valid()            
+
+    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)
+            
+            
+        
+    
+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/InterfaceQT/compobloc.py b/InterfaceQT/compobloc.py
new file mode 100644 (file)
index 0000000..ff386c5
--- /dev/null
@@ -0,0 +1,31 @@
+# -*- coding: utf-8 -*-
+
+from Editeur     import Objecttreeitem
+from InterfaceQT import compofact
+from InterfaceQT import browser
+from qt import *
+
+
+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/InterfaceQT/compocomm.py b/InterfaceQT/compocomm.py
new file mode 100644 (file)
index 0000000..4a12cfe
--- /dev/null
@@ -0,0 +1,107 @@
+# -*- 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
+from InterfaceQT import browser
+from InterfaceQT 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)
+        self.menu.insertItem( qApp.translate('Browser','Uncomment'), 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( 'Citoyen : tu peux "commentariser" une commande MAIS PAS UN COMMENTAIRE' )
+  
+import Extensions
+treeitem =COMMTreeItem
+objet = Extensions.commentaire.COMMENTAIRE    
diff --git a/InterfaceQT/compofact.py b/InterfaceQT/compofact.py
new file mode 100644 (file)
index 0000000..26f97a7
--- /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 Editeur     import Objecttreeitem
+from InterfaceQT import browser
+from qt import *
+
+
+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 doPaste_MCF(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/InterfaceQT/compoformule.py b/InterfaceQT/compoformule.py
new file mode 100644 (file)
index 0000000..d314ba1
--- /dev/null
@@ -0,0 +1,175 @@
+# -*- 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 *
+from InterfaceQT import compooper
+from InterfaceQT import browser
+from InterfaceQT 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=Node =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,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/InterfaceQT/compojdc.py b/InterfaceQT/compojdc.py
new file mode 100644 (file)
index 0000000..288e4be
--- /dev/null
@@ -0,0 +1,116 @@
+# -*- coding: utf-8 -*-
+
+from qt import *
+from Editeur import Objecttreeitem
+from InterfaceQT 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/InterfaceQT/compomacro.py b/InterfaceQT/compomacro.py
new file mode 100644 (file)
index 0000000..e59138f
--- /dev/null
@@ -0,0 +1,170 @@
+# -*- coding: utf-8 -*-
+
+# Modules Python
+import os,sys,string
+import types
+import traceback
+from qt import *
+
+# Modules Eficas
+from Editeur import Objecttreeitem
+from InterfaceQT import compooper
+from InterfaceQT import browser
+from InterfaceQT import typeNode
+
+import convert
+
+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
+
+class INCLUDETreeItemBase(MACROTreeItem):
+
+  def __init__(self,appli, labeltext, object, setfunction):    
+    MACROTreeItem.__init__(self,appli, labeltext, object, setfunction)
+
+  def iscopiable(self):
+      """
+      Retourne 1 si l'objet est copiable, 0 sinon
+      """
+      return 0
+
+
+class INCLUDENode(browser.JDCNode,typeNode.PopUpMenuNode):    
+##    def getPanel(self):
+##        """
+##        """
+##        return INCLUDEPanel( self, self.editor )
+    
+    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
+##        appli.bureau.ShowJDC(   self.item.object.jdc_aux,
+##                                self.item.object.jdc_aux.nom,
+##                                label_onglet=None,
+##                                JDCDISPLAY=macrodisplay.MACRODISPLAY)                            
+        self.editor.vm.displayJDC( self.item.object.jdc_aux ) #, self.item.object.jdc_aux.nom )                                
+    
+    def makeView(self):#,appli,node):
+        pass #CS_pbruno todo
+  
+
+
+class INCLUDETreeItem(INCLUDETreeItemBase):
+##   panel=INCLUDEPanel
+    itemNode=INCLUDENode
+    
+
+    
+class POURSUITENode(browser.JDCNode, typeNode.PopUpMenuNode):    
+##    def getPanel(self):
+##        """
+##        """
+##        return INCLUDEPanel( self, self.editor )
+
+    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
+##                Fenetre(self,titre="Poursuite non editable",texte=msg,wrap='none') #CS_pbruno todo
+                return
+    
+        if not hasattr(self.item.object,"jdc_aux") or self.item.object.jdc_aux is None:
+            #La poursuite n'est pas initialisee
+            text="""DEBUT()
+                    FIN()"""
+            self.object.build_poursuite(None,text)
+    
+        # On cree un nouvel onglet dans le bureau
+##        appli.bureau.ShowJDC(   self.item.object.jdc_aux,
+##                                self.item.object.jdc_aux.nom,
+##                                label_onglet=None,
+##                                JDCDISPLAY=macrodisplay.MACRODISPLAY)                            
+        self.editor.vm.displayJDC( self.item.object.jdc_aux ) #, self.item.object.jdc_aux.nom )        
+    
+    def makeView(self):#,appli,node):
+        pass #CS_pbruno todo
+      
+    
+    
+class POURSUITETreeItem(INCLUDETreeItemBase):
+  itemNode=POURSUITENode
+##  def makeEdit(self,appli,node):
+##    if self.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.object.text_error
+##        Fenetre(self,titre="Poursuite non editable",texte=msg,wrap='none')
+##        return
+##
+##    if not hasattr(self.object,"jdc_aux") or self.object.jdc_aux is None:
+##       #La poursuite n'est pas initialisee
+##       text="""DEBUT()
+##FIN()"""
+##       self.object.build_poursuite(None,text)
+##
+##    # On cree un nouvel onglet dans le bureau
+##    appli.bureau.ShowJDC(self.object.jdc_aux,self.object.jdc_aux.nom,
+##                             label_onglet=None,
+##                             JDCDISPLAY=macrodisplay.MACRODISPLAY)
+##
+##  def makeView(self,appli,node):
+##    if not hasattr(self.object,"jdc_aux") or self.object.jdc_aux is None:
+##         showerror("Poursuite vide","Une POURSUITE doit etre correctement initialisée pour etre visualisée")
+##         return
+##    nom=self.object.nom
+##    if hasattr(self.object,'fichier_ini'):
+##       if self.object.fichier_ini is None:
+##          nom=nom+' '+"Fichier non défini"
+##       else:
+##          nom=nom+' '+self.object.fichier_ini
+##    macdisp=macrodisplay.makeMacroDisplay(appli,self,nom)
+
+class INCLUDE_MATERIAUTreeItem(INCLUDETreeItemBase):
+  rmenu_specs=[("View","makeView"),
+              ]
+  def iscopiable(self):
+      """
+      Retourne 1 si l'objet est copiable, 0 sinon
+      """
+      return 1
+
+
+def treeitem(appli, labeltext, object, setfunction=None):
+   """ Factory qui retourne l'item adapté 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
+    
+#import macrodisplay
diff --git a/InterfaceQT/compomclist.py b/InterfaceQT/compomclist.py
new file mode 100644 (file)
index 0000000..256f0f6
--- /dev/null
@@ -0,0 +1,206 @@
+# -*- coding: utf-8 -*-
+
+import types
+import traceback
+
+from qt import *
+
+from InterfaceQT import compofact
+from InterfaceQT 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"
+           print "kkkkkkkkkkkkkkkkkkkkk"
+
+    def doPaste(self,node_selected):
+        objet_a_copier = self.item.get_copie_objet()
+        child=node_selected.doPaste_MCF(objet_a_copier)
+        #print "doPaste",child
+        return child
+
+    def doPaste_MCF(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/InterfaceQT/componiveau.py b/InterfaceQT/componiveau.py
new file mode 100644 (file)
index 0000000..37b38b7
--- /dev/null
@@ -0,0 +1,98 @@
+# -*- coding: utf-8 -*-
+
+from qt import *
+from Editeur     import Objecttreeitem
+from Extensions  import commentaire 
+from InterfaceQT import browser
+
+class Node(browser.JDCNode): pass
+##    def getPanel(self):
+##        """        
+##        """    
+##        return NIVEAUPanel( self, self.editor )
+
+class NIVEAUTreeItem(Objecttreeitem.ObjectTreeItem):
+##  panel = NIVEAUPanel
+  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/InterfaceQT/componuplet.py b/InterfaceQT/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/InterfaceQT/compooper.py b/InterfaceQT/compooper.py
new file mode 100644 (file)
index 0000000..5e84c73
--- /dev/null
@@ -0,0 +1,247 @@
+# -*- coding: utf-8 -*-
+
+import traceback
+import string
+
+from qt import *
+
+from Editeur     import Objecttreeitem
+from InterfaceQT import browser
+from InterfaceQT 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)
+
+    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.doPaste_Commande(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 doPaste_MCF(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
+
+
+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 accès aux attributs
+      Dans le cas d'une ETAPE, _object et object pointent vers le 
+      meme objet.
+  """
+##  panel = OPERPanel
+  itemNode=Node
+  
+  def IsExpandable(self):
+      return 1
+
+  def GetIconName(self):
+      """
+      Retourne le nom de l'icône à 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:
+         return "ast-red-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
+      """
+      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
+##        return self.labeltext,fontes.standard_italique,None 
+      
+  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):      
+      print "CS_PBRUNO compooper.additem",name,pos
+      mcent = self._object.addentite(name,pos)
+      print "CS_PBRUNO mcent ",mcent 
+      return mcent
+      
+
+  def suppitem(self,item) :
+      # item : item du MOCLE de l'ETAPE à 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.get()
+      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.get()
+      g=generator.plugins[format]()
+      texte_commande = g.gener(self.object,format='beautifie')
+      # Il faut enlever la première 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
+
+  def visu_3D(self,appli,node) :
+      import TroisDPal
+      troisD=TroisDPal.TroisDPilote(node.item,appli,node.parent)
+      troisD.envoievisu()
+
+import Accas
+treeitem = EtapeTreeItem
+objet = Accas.ETAPE    
+
diff --git a/InterfaceQT/compoparam.py b/InterfaceQT/compoparam.py
new file mode 100644 (file)
index 0000000..989c79c
--- /dev/null
@@ -0,0 +1,118 @@
+# -*- 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
+from InterfaceQT import browser
+
+class Node(browser.JDCNode): pass
+##    def getPanel(self):
+##        """        
+##        """    
+##        return PARAMPanel( self, self.editor )
+
+
+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
+##    panel = PARAMPanel
+
+    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 'Paramêtre',None,None #CS_pbruno todo
+##        return 'Paramêtre',Fonte_PARAMETRE,None 
+
+    def GetText(self):
+      """
+      Retourne le texte à afficher aprês le nom de la commande (ici aprês 'paramêtre')
+      Ce texte est tronqué à 25 caractêres
+      """
+      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 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/InterfaceQT/compoparameval.py b/InterfaceQT/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/InterfaceQT/compoproc.py b/InterfaceQT/compoproc.py
new file mode 100644 (file)
index 0000000..862795f
--- /dev/null
@@ -0,0 +1,22 @@
+# -*- coding: utf-8 -*-
+from Editeur     import Objecttreeitem
+from InterfaceQT import compooper
+from InterfaceQT import browser
+
+from qt import *
+
+class Node(browser.JDCNode): pass
+##    def getPanel(self):
+##        """        
+##        """    
+##        return PROCPanel( self, self.editor )
+
+class ProcEtapeTreeItem(compooper.EtapeTreeItem):
+    itemNode=Node
+##  panel = PROCPanel
+    pass
+  
+import Accas
+treeitem = ProcEtapeTreeItem
+objet = Accas.PROC_ETAPE    
+
diff --git a/InterfaceQT/composimp.py b/InterfaceQT/composimp.py
new file mode 100644 (file)
index 0000000..8f99bae
--- /dev/null
@@ -0,0 +1,639 @@
+# -*- coding: utf-8 -*-
+# Modules Python
+import string,types,os
+
+from copy import copy,deepcopy
+import traceback
+from qt import *
+
+# Modules Eficas
+from Editeur      import Objecttreeitem
+from Aster        import prefs
+from InterfaceQT  import browser
+from Noyau.N_CR   import justify_text
+    
+
+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():
+                    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
+
+        #---------------------------------------------------------
+        # PN ajout pour lancement de Salome
+        #---------------------------------------------------------
+        if hasattr( self.editor, 'salome' ):
+##            import panelsSalome
+##        
+##            self.item.select_noeud_maille=0
+##            self.item.clef_fonction="SALOME"
+##            for i in range(0,len( genea )) :
+##                     self.item.clef_fonction=self.item.clef_fonction+"_"+ genea[i]
+##                     #if genea[i] == "GROUP_NO" or genea[i] == "GROUP_MA":
+##            if "GROUP_NO" in genea[len(genea)-1] or "GROUP_MA" in genea[len(genea)-1]:
+##                    self.item.select_noeud_maille=1
+##        
+##            recherche=panelsSalome.dict_classes_salome[klass]
+##            if hasattr(recherche,self.item.clef_fonction):
+##                    klass=recherche
+##            if self.item.select_noeud_maille==1 :
+##                    klass=recherche
+            klass = None #CS_pbruno todo
+        
+        if not klass:
+            return None
+
+        return klass( self, self.editor )
+        
+        
+    
+class SIMPTreeItem(Objecttreeitem.AtomicObjectTreeItem):
+##  from newsimppanel import newSIMPPanel
+##  panel = newSIMPPanel
+  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 wait_into(self):
+#      """ Méthode booléenne qui retourne 1 si l'objet pointé par self
+#      prend ses valeurs dans un ensemble discret (into), 0 sinon """
+#      if self.object.definition.into != None :
+#          return 1
+#      else:
+#          return 0
+
+  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=[]
+      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))
+      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 ...
+  #
+  #---------------------------------------------------
+  # SetText         a priori inutilisee --> commentee
+  # GetIconName
+  # GetText
+  # getval     a  priori inutilisee --> commentee
+  # set_valeur_co
+  # get_sd_avant_du_bon_type
+  # verif        a  priori inutilisee --> commentee
+  # delete_valeur_co
+
+  #def SetText(self, text):
+  #  try:
+  #    value = eval(text)
+  #    self.object.setval(value)
+  #  except:
+  #    pass
+
+  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 getval(self):
+  #    return self.object.getval()
+
+  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 verif(self):
+  #    pass
+
+  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/InterfaceQT/editor.py b/InterfaceQT/editor.py
new file mode 100644 (file)
index 0000000..8a903ed
--- /dev/null
@@ -0,0 +1,668 @@
+# -*- coding: utf-8 -*-
+
+# 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
+from Aster       import prefs
+from InterfaceQT import panelsQT
+from InterfaceQT import browser
+from InterfaceQT import readercata
+
+import qtCommun
+
+VERSION_EFICAS  = "EFICAS v1.12"
+
+
+class StringVar: # a cause de format_fichier (Tkinter.StringVar) appele ailleurs que ds l'Interface
+    def __init__(self):
+        self.val = ""
+    def set(self,str):
+        self.val = str
+    def get(self):
+        return self.val
+            
+# -------------------------- #
+#                            #
+class JDCEditor(QSplitter):
+#                            #
+# -------------------------- #
+    """
+       Editeur de jdc
+    """        
+
+    def __init__(self,fn = None, jdc = None ,parent=None, editor = None):          
+    #-------------------------------------------------------------------#
+
+        QSplitter.__init__(self, parent,'')
+        
+        VERSION_CODE    = session.d_env.cata
+        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 = StringVar()
+        self.format_fichier.set('python') #CS_pbruno gestion python uniquement
+        self.ihm="QT"
+        
+        from Editeur import configuration
+        self.CONFIGURATION = configuration.make_config(self,prefs.REPINI)
+        self.CONFIGStyle = configuration.make_config_style(self,prefs.REPINI)
+        self.test=0
+        self.sb = None
+        if hasattr(qApp.mainWidget(),"statusBar"):
+            self.sb = qApp.mainWidget().statusBar()
+      
+        self.parent         = parent
+        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
+                        
+        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)
+            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
+                self.jdc = self._newJDC()
+        
+        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():
+                    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 ):        
+    #-------------------#
+        """
+        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
+                                        )                         
+        jdc.analyse()        
+        return jdc
+        
+            
+    #-----------------------#
+    def get_source(self,file):
+    #-----------------------#
+        import convert
+        format=self.format_fichier.get()
+
+        # 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'
+            labeltexte = 'Fichier à  poursuivre :'
+                                        
+        fn = QFileDialog.getOpenFileName(   None,
+                                            "", 
+                                            self,
+                                            None,
+                                            labeltexte )                                            
+                        
+        print 'GETFILE', fn
+        
+        if fn.isNull():
+            return
+            
+        ulfile = os.path.abspath(unicode(fn))
+        # On utilise le convertisseur défini par format_fichier
+        print 'GETFILE', ulfile
+        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.get() ):
+             # 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.get()]()
+             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()        
+        self.lastModified = self.fileInfo.lastModified()
+        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.get()
+        strSource = str( self.get_text_JDC(format) )       
+        self._viewText(strSource, "JDC_SOURCE")
+                
+    #-----------------------#
+    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
+            
+        print jdcNode.__class__
+        if jdcNode.item.isactif():
+            self.panel = jdcNode.getPanel()
+        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):
+    #---------------------#
+        """
+        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)
+        txt = self.get_text_JDC('python')
+
+        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 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 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()            
+            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/InterfaceQT/eficas.py b/InterfaceQT/eficas.py
new file mode 100644 (file)
index 0000000..0a9c2a9
--- /dev/null
@@ -0,0 +1,66 @@
+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/InterfaceQT/monChoixCata.py b/InterfaceQT/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/InterfaceQT/monCommandePanel.py b/InterfaceQT/monCommandePanel.py
new file mode 100644 (file)
index 0000000..a15cc8a
--- /dev/null
@@ -0,0 +1,69 @@
+# -*- 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 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/InterfaceQT/monCommentairePanel.py b/InterfaceQT/monCommentairePanel.py
new file mode 100644 (file)
index 0000000..ae6ce6e
--- /dev/null
@@ -0,0 +1,54 @@
+# -*- 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 Aster import prefs
+
+# Import des panels
+
+class MonCommentairePanel(DComment,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):
+        QTPanel.__init__(self,node,parent)
+        DComment.__init__(self,parent,name,fl)
+        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()
+
diff --git a/InterfaceQT/monFonctionPanel.py b/InterfaceQT/monFonctionPanel.py
new file mode 100644 (file)
index 0000000..272c89a
--- /dev/null
@@ -0,0 +1,124 @@
+# -*- 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 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)) 
+        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,validite=self.TraiteLEValeur()
+        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)
+            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 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
+        print listeVal
+        self.listeValeursCourantes=listeVal
+        listeValeurs=self.listeValeursCourantes
+        self.LBValeurs.clear()
+        for valeur in self.DecoupeListeValeurs(listeValeurs):
+            self.LBValeurs.insertItem(str(valeur))
+
diff --git a/InterfaceQT/monFormulePanel.py b/InterfaceQT/monFormulePanel.py
new file mode 100644 (file)
index 0000000..6fa2e58
--- /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
+# 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=""
+        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 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_valid()
+         self.node.update_node_texte()
+         commentaire = "Formule modifiée"
+      else:
+         commentaire ="Formule incorrecte : " + erreur 
+      self.editor.init_modif()
+      self.editor.affiche_infos(commentaire)
diff --git a/InterfaceQT/monMCFactPanel.py b/InterfaceQT/monMCFactPanel.py
new file mode 100644 (file)
index 0000000..ccd3f6e
--- /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 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)
+
diff --git a/InterfaceQT/monMCListAjoutPanel.py b/InterfaceQT/monMCListAjoutPanel.py
new file mode 100644 (file)
index 0000000..622deab
--- /dev/null
@@ -0,0 +1,49 @@
+# -*- 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())
+
diff --git a/InterfaceQT/monMacroPanel.py b/InterfaceQT/monMacroPanel.py
new file mode 100644 (file)
index 0000000..b7905c2
--- /dev/null
@@ -0,0 +1,65 @@
+# -*- 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 qt import *
+
+
+# Import des panels
+
+class MonMacroPanel(DMacro,QTPanelTBW1,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):
+        DMacro.__init__(self,parent,name,fl)
+        QTPanel.__init__(self,node,parent)
+        QTPanelTBW2.__init__(self,node,parent)
+        QTPanelTBW1.__init__(self,node,parent)
+
+  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)
+
diff --git a/InterfaceQT/monPlusieursASSDPanel.py b/InterfaceQT/monPlusieursASSDPanel.py
new file mode 100644 (file)
index 0000000..0b7a641
--- /dev/null
@@ -0,0 +1,112 @@
+# -*- 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 Aster import prefs 
+
+from qt import *
+from monPlusieursIntoPanel import MonPlusieursIntoPanel
+from desPlusieursInto      import DPlusInto
+from qtCommun              import QTPanel
+from politiquesValidation  import PolitiquePlusieurs
+# Import des panels
+
+class MonPlusieursASSDPanel(MonPlusieursIntoPanel):
+  """
+  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):
+        QTPanel.__init__(self,node,parent)
+        DPlusInto.__init__(self,parent,name,fl)
+
+        self.listeValeursCourantes=self.node.item.GetListeValeurs()
+        self.InitValeursCourantes()
+        self.DisplayListBoxCourantes()
+        self.DisplayListBoxPossibles()
+
+        self.politique=PolitiquePlusieurs(node,parent)
+        #QObject.connect(self.listBoxVal, SIGNAL("doubleClicked(QListBoxItem*)" ), self.Ajout1Valeur )
+        #    QObject.connect(self.listBoxVal, SIGNAL("doubleClicked(QListBoxItem*)" ), self.ClicASSD )
+
+  def DisplayListBoxPossibles(self):
+        listeNomsSD = self.node.item.get_sd_avant_du_bon_type()
+        self.listBoxVal.clear()
+        for aSD in listeNomsSD:
+            if aSD not in self.listNomsValeurs :
+               self.listBoxVal.insertItem( aSD)
+
+  def DisplayListBoxCourantes(self):
+        self.LBValeurs.clear()
+        for aSD in self.listNomsValeurs :
+            self.LBValeurs.insertItem( aSD)
+
+  def InitValeursCourantes(self):
+        self.listNomsValeurs=[]
+        for i in self.listeValeursCourantes :
+              self.listNomsValeurs.append(i.get_name())
+
+  def BOkPourListePressed(self):
+        self.node.item.set_valeur(self.listeValeursCourantes)
+       self.editor.affiche_infos("Valeur Acceptée")
+       pass
+
+  def BSupPressed(self):
+        QTPanel.BSupPressed(self)
+
+  def Sup1Valeur(self):
+        index=self.LBValeurs.currentItem()
+        self.LBValeurs.removeItem(self.LBValeurs.currentItem())
+        listeVal=[]
+        i=0
+        for valeur in self.listeValeursCourantes :
+                if i != index : listeVal.append(valeur)
+                i = i+1
+        self.listeValeursCourantes=listeVal
+        self.InitValeursCourantes()
+        self.DisplayListBoxCourantes()
+        self.DisplayListBoxPossibles()
+          
+  def Ajout1Valeur(self):
+        liste=[]
+        liste.append(self.listBoxVal.currentText().latin1())
+        index=self.LBValeurs.currentItem() + 1
+        if index==0 : index = -1
+        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:
+           l1=self.listeValeursCourantes[:index]
+           l3=self.listeValeursCourantes[index:]
+           for valeur in listeRetour:
+               self.LBValeurs.insertItem(QString(str(valeur)),index)
+               index=index+1
+           self.listeValeursCourantes=l1+listeRetour+l3
+           self.InitValeursCourantes()
+           self.DisplayListBoxCourantes()
+           self.DisplayListBoxPossibles()
diff --git a/InterfaceQT/monPlusieursBasePanel.py b/InterfaceQT/monPlusieursBasePanel.py
new file mode 100644 (file)
index 0000000..f53f67f
--- /dev/null
@@ -0,0 +1,96 @@
+# -*- 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 Aster import prefs
+
+from qt import *
+
+from desPlusieursBase import DPlusBase
+from qtCommun      import QTPanel
+from qtSaisie      import SaisieValeur
+from politiquesValidation import PolitiquePlusieurs
+
+# Import des panels
+
+class MonPlusieursBasePanel(DPlusBase,QTPanel,SaisieValeur):
+  """
+  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):
+        QTPanel.__init__(self,node,parent)
+        DPlusBase.__init__(self,parent,name,fl)
+        self.politique=PolitiquePlusieurs(node,parent)
+        self.BuildLBValeurs()
+        self.listeValeursCourantes=self.node.item.GetListeValeurs()
+
+  def BuildLBValeurs(self):
+       # redefinit en raison de l heritage par monFonctionPanel
+        SaisieValeur.BuildLBValeurs(self)
+
+  def BOkPourListePressed(self):
+        self.node.item.set_valeur(self.listeValeursCourantes)
+       self.editor.affiche_infos("Valeur Acceptée")
+
+  def BSupPressed(self):
+        QTPanel.BSupPressed(self)
+
+  def LEValeurPressed(self):
+        self.Ajout1Valeur()
+
+  def Sup1Valeur(self):
+        index=self.LBValeurs.currentItem()
+        self.LEValeur.setText(self.LBValeurs.currentText())
+        self.LBValeurs.removeItem(self.LBValeurs.currentItem())
+        listeVal=[]
+        i=0
+        for valeur in self.listeValeursCourantes :
+                if i != index : listeVal.append(valeur)
+                i = i+1
+        self.listeValeursCourantes=listeVal
+          
+
+  def Ajout1Valeur(self):
+        liste,validite=SaisieValeur.TraiteLEValeur(self)
+        if validite == 0 : return
+        if liste ==[]    : return
+
+        index=self.LBValeurs.currentItem() + 1
+        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[:index]
+           l3=self.listeValeursCourantes[index:]
+           for valeur in listeRetour:
+               self.LBValeurs.insertItem(QString(str(valeur)),index)
+               index=index+1
+           self.listeValeursCourantes=l1+listeRetour+l3
+
diff --git a/InterfaceQT/monPlusieursIntoPanel.py b/InterfaceQT/monPlusieursIntoPanel.py
new file mode 100644 (file)
index 0000000..7aa23d7
--- /dev/null
@@ -0,0 +1,89 @@
+# -*- 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 Aster import prefs 
+
+from qt import *
+
+from desPlusieursInto import DPlusInto
+from qtCommun      import QTPanel
+from qtSaisie      import SaisieValeur
+from politiquesValidation import PolitiquePlusieurs
+
+# Import des panels
+
+class MonPlusieursIntoPanel(DPlusInto,QTPanel,SaisieValeur):
+  """
+  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):
+        QTPanel.__init__(self,node,parent)
+        DPlusInto.__init__(self,parent,name,fl)
+        self.politique=PolitiquePlusieurs(node,parent)
+        SaisieValeur.BuildLBValeurs(self)
+        self.listeValeursCourantes=self.node.item.GetListeValeurs()
+        SaisieValeur.RemplitPanel(self,self.listeValeursCourantes)
+        QObject.connect(self.listBoxVal, SIGNAL("doubleClicked(QListBoxItem*)" ), self.Ajout1Valeur )
+
+  def BOkPourListePressed(self):
+        self.node.item.set_valeur(self.listeValeursCourantes)
+       self.editor.affiche_infos("Valeur Acceptée")
+
+  def BSupPressed(self):
+        QTPanel.BSupPressed(self)
+
+  def Sup1Valeur(self):
+        index=self.LBValeurs.currentItem()
+        self.LBValeurs.removeItem(self.LBValeurs.currentItem())
+        listeVal=[]
+        i=0
+        for valeur in self.listeValeursCourantes :
+                if i != index : listeVal.append(valeur)
+                i = i+1
+        self.listeValeursCourantes=listeVal
+        SaisieValeur.RemplitPanel(self,self.listeValeursCourantes)
+          
+  def Ajout1Valeur(self):
+        liste=[]
+        liste.append(self.listBoxVal.currentText().latin1())
+        index=self.LBValeurs.currentItem() + 1
+        if index==0 : index = -1
+        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:
+           l1=self.listeValeursCourantes[:index]
+           l3=self.listeValeursCourantes[index:]
+           for valeur in listeRetour:
+               self.LBValeurs.insertItem(QString(str(valeur)),index)
+               index=index+1
+           self.listeValeursCourantes=l1+listeRetour+l3
+        SaisieValeur.RemplitPanel(self,self.listeValeursCourantes)
+
diff --git a/InterfaceQT/monRacinePanel.py b/InterfaceQT/monRacinePanel.py
new file mode 100644 (file)
index 0000000..c36411a
--- /dev/null
@@ -0,0 +1,75 @@
+# -*- 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 desRacine import DRac
+from qtCommun  import QTPanel
+from qtCommun  import QTPanelTBW2
+from qtCommun  import itemColore
+from qt import *
+
+
+# Import des panels
+
+class MonRacinePanel(DRac,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):
+        DRac.__init__(self,parent,name,fl)
+        QTPanel.__init__(self,node,parent)
+        QTPanelTBW2.__init__(self,node,parent)
+
+  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 AppelleBuildLBRegles(self):
+      listeRegles=self.node.item.get_regles()
+      listeNomsEtapes = self.node.item.get_l_noms_etapes()
+      self.BuildLBRegles(listeRegles,listeNomsEtapes)
+
+  def DefCmd(self):
+      name=str(self.LBNouvCommande.selectedItem().text())
+      if name==QString(" "): return
+      if name.find("GROUPE :")==0 : return
+      self.editor.init_modif()
+      new_node = self.node.append_child(name,'first')
diff --git a/InterfaceQT/monUniqueASSDPanel.py b/InterfaceQT/monUniqueASSDPanel.py
new file mode 100644 (file)
index 0000000..7bc1cdf
--- /dev/null
@@ -0,0 +1,53 @@
+# -*- 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 Aster import prefs 
+
+from qt import *
+
+from desUniqueASSD import DUnASSD
+from qtCommun      import QTPanel
+from qtSaisie      import SaisieValeur
+from politiquesValidation import PolitiqueUnique
+
+# Import des panels
+
+class MonUniqueASSDPanel(DUnASSD,QTPanel,SaisieValeur):
+  """
+  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):
+        QTPanel.__init__(self,node,parent)
+        DUnASSD.__init__(self,parent,name,fl)
+        self.politique=PolitiqueUnique(node,parent)
+        self.InitListBoxASSD()
+
+  def BOkPressed(self):
+        self.clicASSD()
+
+  def BSupPressed(self):
+        QTPanel.BSupPressed(self)
+
diff --git a/InterfaceQT/monUniqueBasePanel.py b/InterfaceQT/monUniqueBasePanel.py
new file mode 100644 (file)
index 0000000..8e83ec8
--- /dev/null
@@ -0,0 +1,65 @@
+# -*- 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 Aster import prefs 
+
+from qt import *
+
+from desUniqueBase import DUnBase
+from qtCommun      import QTPanel
+from qtSaisie      import SaisieValeur
+from politiquesValidation import PolitiqueUnique
+
+# Import des panels
+
+class MonUniqueBasePanel(DUnBase,QTPanel,SaisieValeur):
+  """
+  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):
+        QTPanel.__init__(self,node,parent)
+        DUnBase.__init__(self,parent,name,fl)
+        self.politique=PolitiqueUnique(node,parent)
+        self.InitLineEditVal()
+
+  def InitLineEditVal(self):
+        valeur=self.node.item.get_valeur()
+        valeurTexte=self.politique.GetValeurTexte(valeur)
+        if valeurTexte != None:
+           try :
+               str=QString("").setNum(valeurTexte)
+           except :
+               str=QString(valeurTexte)
+           self.lineEditVal.setText(str)
+
+  def BOk2Pressed(self):
+        SaisieValeur.BOk2Pressed(self)
+
+  def BSupPressed(self):
+        QTPanel.BSupPressed(self)
+
+  def LEValeurPressed(self):
+        SaisieValeur.LEValeurPressed(self)
diff --git a/InterfaceQT/monUniqueCompPanel.py b/InterfaceQT/monUniqueCompPanel.py
new file mode 100644 (file)
index 0000000..e47f294
--- /dev/null
@@ -0,0 +1,152 @@
+# -*- 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,re
+
+# Modules Eficas
+from Aster import prefs 
+
+from qt import *
+
+from desUniqueComp import DUnComp
+from qtCommun      import QTPanel
+from politiquesValidation import PolitiqueUnique
+
+# Import des panels
+
+#class MonUniqueCompPanel(DUnComp,QTPanel,SaisieValeur):
+class MonUniqueCompPanel(DUnComp,QTPanel,PolitiqueUnique):
+  """
+  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):
+        QTPanel.__init__(self,node,parent)
+        DUnComp.__init__(self,parent,name,fl)
+        self.politique=PolitiqueUnique(node,parent)
+        self.InitLinesVal()
+
+  def InitLinesVal(self):
+        valeur=self.node.item.get_valeur()
+        if valeur == None or valeur == '' : return
+        if type(valeur) not in (types.ListType,types.TupleType) :
+           self.LEcomp.setText(str(valeur))
+        else :
+           typ_cplx,x1,x2=valeur
+           self.LEReel.setText(str(x1))
+           self.LEImag.setText(str(x2))
+           if typ_cplx == "RI" :
+              self.buttonGroup1.setButton(1)
+           else :
+              self.buttonGroup1.setButton(0)
+      
+
+  def LEcompRPressed(self) :
+        self.LEReel.clear()
+        self.LEImag.clear()
+        commentaire="expression valide"
+        valeur = str(self.LEcomp.text())
+        d={}
+        try :
+          v=eval(valeur,d)
+        except :
+          commentaire="expression invalide"
+          self.editor.affiche_infos(commentaire)
+          return
+        try :
+          i=v.imag
+        except :
+          commentaire="expression n est pas de la forme a+bj"
+        self.editor.affiche_infos(commentaire)
+          
+  def LEReelRPressed(self):
+        self.LEcomp.clear()
+        commentaire="expression valide"
+        valeur = str(self.LEReel.text())
+        try :
+          a=string.atof(valeur)
+        except :
+          commentaire="expression invalide"
+        self.editor.affiche_infos(commentaire)
+
+  def LEImagRPressed(self):
+        self.LEcomp.clear()
+        commentaire="expression valide"
+        valeur = str(self.LEImag.text())
+        try :
+          a=string.atof(valeur)
+        except :
+          commentaire="expression invalide"
+        self.editor.affiche_infos(commentaire)
+
+  def BOkPressed(self):
+        if self.LEcomp.text()== "" : 
+           valeur = self.getValeurAster()
+        else :
+           if self.LEReel.text() != "" or self.LEImag.text() != "" :
+              commentaire="entrer une seule valeur SVP"
+              self.editor.affiche_infos(commentaire)
+              return
+           valeur=  self.getValeurComp()
+        self.politique.RecordValeur(valeur)
+
+  def getValeurAster(self):
+      """
+      Retourne le complexe saisi par l'utilisateur
+      """
+      l=[]
+      if  (self.buttonGroup1.selectedId() == 0 ) :
+         l.append("MP")
+      elif (self.buttonGroup1.selectedId() == 1) :
+         l.append("RI")
+      else :
+         commentaire="saisir le type de complexe"
+         self.editor.affiche_infos(commentaire)
+         return None
+      try :
+         l.append(string.atof(str(self.LEReel.text())))
+         l.append(string.atof(str(self.LEImag.text())))
+      except :
+         return None
+      return `tuple(l)`
+
+  def getValeurComp(self):
+        commentaire="expression valide"
+        valeur = str(self.LEcomp.text())
+        d={}
+        try :
+          v=eval(valeur,d)
+        except :
+          commentaire="expression invalide"
+          self.editor.affiche_infos(commentaire)
+          return None
+        try :
+          i=v.imag
+        except :
+          commentaire="expression n est pas de la forme a+bj"
+          self.editor.affiche_infos(commentaire)
+          return None
+        return v
+
+  def BSupPressed(self):
+        QTPanel.BSupPressed(self)
+
diff --git a/InterfaceQT/monUniqueIntoPanel.py b/InterfaceQT/monUniqueIntoPanel.py
new file mode 100644 (file)
index 0000000..144dc70
--- /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
+import string,types,os
+
+# Modules Eficas
+from Aster import prefs 
+
+from qt import *
+
+from desUniqueIntoPanel   import DUnIn
+from qtCommun             import QTPanel
+from qtSaisie             import SaisieValeur
+from politiquesValidation import PolitiqueUnique
+
+# Import des panels
+
+class MonUniqueIntoPanel(DUnIn,QTPanel,SaisieValeur):
+  """
+  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):
+        QTPanel.__init__(self,node,parent)
+        DUnIn.__init__(self,parent,name,fl)
+        SaisieValeur.RemplitPanel(self)
+        self.politique=PolitiqueUnique(node,parent)
+        QObject.connect(self.listBoxVal, SIGNAL("doubleClicked(QListBoxItem*)" ), self.ClicValeur )
+
+  def ClicValeur(self):
+        SaisieValeur.ClicValeur(self)
+
+  def BOkPressed(self):
+        SaisieValeur.BOkPressed(self)
+
+  def BSupPressed(self):
+        QTPanel.BSupPressed(self)
+
diff --git a/InterfaceQT/myMain_ui.py b/InterfaceQT/myMain_ui.py
new file mode 100644 (file)
index 0000000..697e5b4
--- /dev/null
@@ -0,0 +1,516 @@
+# -*- coding: utf-8 -*-
+
+# Form implementation generated from reading ui file 'myMain.ui'
+#
+# Created: lun mar 5 15:21:40 2007
+#      by: The PyQt User Interface Compiler (pyuic) 3.13
+#
+# WARNING! All changes made in this file will be lost!
+
+
+from qt import *
+
+image0_data = \
+    "\x89\x50\x4e\x47\x0d\x0a\x1a\x0a\x00\x00\x00\x0d" \
+    "\x49\x48\x44\x52\x00\x00\x00\x16\x00\x00\x00\x16" \
+    "\x08\x06\x00\x00\x00\xc4\xb4\x6c\x3b\x00\x00\x00" \
+    "\x74\x49\x44\x41\x54\x38\x8d\xed\xd5\xc1\x09\xc0" \
+    "\x20\x0c\x05\xd0\x6f\xe9\x36\x81\x2c\x10\xb2\xff" \
+    "\xdd\x85\xd2\x53\x85\xb6\xa9\x91\x48\x0f\x05\x3f" \
+    "\x08\x1a\xf0\x29\x12\x10\xf8\x28\xc5\xa9\xd9\xc4" \
+    "\xde\x96\xcd\x2b\x9a\xd9\xeb\x00\x00\x66\x0e\x2f" \
+    "\xe0\xc2\x51\x98\x39\xc4\xf7\x0c\x4c\x44\x6d\x5e" \
+    "\x6b\x35\x38\xcf\x92\x82\x45\xe4\xb2\xf6\xf0\x14" \
+    "\xac\xaa\x8f\xda\x1d\x4f\xc1\xa5\x74\x1b\x22\x07" \
+    "\x9f\x9d\x11\x1d\x96\xea\x8a\x91\x2c\x78\xc1\x0b" \
+    "\xee\x64\xe6\x07\x19\xf5\x7e\x92\x03\xad\x45\x2a" \
+    "\x04\xcc\x4e\x50\x20\x00\x00\x00\x00\x49\x45\x4e" \
+    "\x44\xae\x42\x60\x82"
+image1_data = \
+    "\x89\x50\x4e\x47\x0d\x0a\x1a\x0a\x00\x00\x00\x0d" \
+    "\x49\x48\x44\x52\x00\x00\x00\x16\x00\x00\x00\x16" \
+    "\x08\x06\x00\x00\x00\xc4\xb4\x6c\x3b\x00\x00\x00" \
+    "\x99\x49\x44\x41\x54\x38\x8d\xed\x94\x41\x0e\x85" \
+    "\x20\x0c\x44\x5f\x89\xc7\x36\x7f\x61\xbc\x77\x5d" \
+    "\x28\x48\xa4\x28\x60\xff\xce\xd9\x54\x8b\xbe\x8e" \
+    "\x13\x04\x3e\x1d\x92\x81\x77\xf4\x81\xa1\x23\xdc" \
+    "\x2b\x34\xf6\xf4\x7a\x3d\xe2\xb8\x65\xa8\x84\x3f" \
+    "\x40\x01\x98\x2a\x0b\x3d\x5f\x62\xc5\x83\x00\xaa" \
+    "\x1a\xd7\x05\x50\x44\x9a\xb9\xd5\x07\xa7\x73\xa8" \
+    "\xa4\xba\x4f\x92\xa2\xdf\x33\x3c\x64\xc6\x3b\xeb" \
+    "\xbd\x82\xe5\xb8\xad\xde\xcb\xcc\x78\x20\xeb\x42" \
+    "\x66\xc6\x39\x74\x5d\xfa\x80\xf3\x6f\xaf\x66\xc6" \
+    "\x6f\xa1\x9c\x3f\x88\x2f\xb4\x70\xec\x05\xcd\xc0" \
+    "\xbe\xd0\x78\x93\xf6\x8e\x17\x14\x92\x63\x5f\x68" \
+    "\x6c\x3e\xef\xf6\xba\x3c\x8f\xdd\x36\x6d\xc4\xc0" \
+    "\x45\x2c\x87\x81\xf8\x08\x00\x00\x00\x00\x49\x45" \
+    "\x4e\x44\xae\x42\x60\x82"
+image2_data = \
+    "\x89\x50\x4e\x47\x0d\x0a\x1a\x0a\x00\x00\x00\x0d" \
+    "\x49\x48\x44\x52\x00\x00\x00\x16\x00\x00\x00\x16" \
+    "\x08\x06\x00\x00\x00\xc4\xb4\x6c\x3b\x00\x00\x00" \
+    "\xa0\x49\x44\x41\x54\x38\x8d\xd5\x95\x4d\x0a\x80" \
+    "\x20\x10\x85\x9f\xd1\x46\x68\xe1\x8d\xe6\x62\xd2" \
+    "\x22\xbc\x98\x37\x6a\x21\xb4\xac\x45\x19\x92\xc6" \
+    "\x64\x69\xe0\xb7\xf1\x87\xf1\xf1\x1c\x47\x05\x2a" \
+    "\x21\x8e\x76\x2d\xad\xdb\xfb\x9e\x99\xf6\x56\x8f" \
+    "\x80\xb5\x36\x4b\x85\x88\xce\x35\x44\x04\x00\xe8" \
+    "\x0a\x39\x8c\xe8\xf9\x90\x34\xd2\x29\x2c\xc3\x7c" \
+    "\x8e\xbd\x53\x0f\xeb\x58\x3a\x05\xe9\x54\x34\x1f" \
+    "\x8a\x02\x7b\x2a\x7d\x3a\x1f\x09\xbf\x85\x4d\xc5" \
+    "\xd5\xd9\x53\xaa\x39\x6e\x4f\x38\xca\xb1\x99\xe2" \
+    "\xd2\xe1\x08\xab\xe1\x56\xf8\x2e\x30\x97\x7f\xcb" \
+    "\x4d\x8f\xf9\x42\xd7\x5d\xbe\xbe\xd2\xe1\x43\x95" \
+    "\x3a\x93\xf6\xca\xad\x3d\x61\x11\xf4\x4b\x7d\x4f" \
+    "\x82\x0f\xf9\xc0\x06\x9b\xb5\x1e\xcd\xed\x31\x8c" \
+    "\x5c\x00\x00\x00\x00\x49\x45\x4e\x44\xae\x42\x60" \
+    "\x82"
+image3_data = \
+    "\x89\x50\x4e\x47\x0d\x0a\x1a\x0a\x00\x00\x00\x0d" \
+    "\x49\x48\x44\x52\x00\x00\x00\x16\x00\x00\x00\x16" \
+    "\x08\x06\x00\x00\x00\xc4\xb4\x6c\x3b\x00\x00\x00" \
+    "\x73\x49\x44\x41\x54\x38\x8d\xed\x92\xc1\x0e\x80" \
+    "\x20\x08\x40\xb1\xef\x66\x1d\x1c\xff\x4d\x87\x6a" \
+    "\xa8\x88\xa1\x76\x69\xf9\x36\x0f\x28\x3e\xd8\x00" \
+    "\x60\xf1\x59\x42\x5f\x3a\x71\xf5\x36\x02\xe0\x8e" \
+    "\x99\x2b\x09\x88\x01\xd0\x28\x54\x17\x6a\xe4\x7f" \
+    "\x21\xce\x1f\xb5\xb0\x5d\x38\xed\xdc\x90\x60\xd0" \
+    "\xf1\x13\x79\x63\x5b\x3b\xc9\x2b\xd5\x18\xe2\x39" \
+    "\xa9\x43\xec\x1d\x5a\xb7\x78\x5c\xee\x10\x7b\xe4" \
+    "\xb2\x15\xaf\x40\x91\xf8\x94\xde\x47\x18\x1e\xce" \
+    "\xa5\x9e\xde\x9e\xc5\x9f\x38\x00\x62\xac\x28\xb1" \
+    "\xe3\xd7\x01\xd9\x00\x00\x00\x00\x49\x45\x4e\x44" \
+    "\xae\x42\x60\x82"
+image4_data = \
+    "\x89\x50\x4e\x47\x0d\x0a\x1a\x0a\x00\x00\x00\x0d" \
+    "\x49\x48\x44\x52\x00\x00\x00\x16\x00\x00\x00\x16" \
+    "\x08\x06\x00\x00\x00\xc4\xb4\x6c\x3b\x00\x00\x00" \
+    "\x74\x49\x44\x41\x54\x38\x8d\xed\x92\xc1\x0a\xc0" \
+    "\x20\x08\x40\x6d\xdf\x2d\x3b\x84\xff\xed\x0e\xa3" \
+    "\x58\x6a\x26\xd1\x65\xe0\x83\x0e\xa5\x3e\x85\x04" \
+    "\x48\x7e\x4b\x91\x0f\x54\x89\xf1\x9e\xa5\xa3\xca" \
+    "\x0f\x8a\x89\x63\x65\xb3\x06\xc4\x2d\xd6\x13\xc6" \
+    "\x49\xbd\xc2\x59\x83\x16\x13\x62\x19\xf0\xf9\x36" \
+    "\xc0\xa2\xef\x00\xd7\x5a\x62\x61\x4d\x3a\xb2\x29" \
+    "\x96\xf2\xa3\x62\xff\xa3\x37\xc5\xeb\xed\xe9\x62" \
+    "\xaa\xd1\xa2\xe8\x4a\xaa\xa2\xf7\x50\xdd\x12\x74" \
+    "\x8c\x0f\xd0\xab\x93\x24\x67\x78\x00\x59\x6e\x28" \
+    "\xb1\x74\x3f\x46\x86\x00\x00\x00\x00\x49\x45\x4e" \
+    "\x44\xae\x42\x60\x82"
+image5_data = \
+    "\x89\x50\x4e\x47\x0d\x0a\x1a\x0a\x00\x00\x00\x0d" \
+    "\x49\x48\x44\x52\x00\x00\x00\x16\x00\x00\x00\x16" \
+    "\x08\x06\x00\x00\x00\xc4\xb4\x6c\x3b\x00\x00\x00" \
+    "\x82\x49\x44\x41\x54\x38\x8d\xcd\xd3\x41\x12\x80" \
+    "\x20\x08\x05\x50\xe8\xe0\x2e\xbc\x38\xad\x32\x73" \
+    "\x50\x3e\x48\x53\x7f\xe3\xe4\x8c\x4f\x24\x25\xfa" \
+    "\x28\xe2\x9c\x6f\x39\x92\x0b\xf9\x27\x6c\xb6\x01" \
+    "\x85\x35\x88\x77\x61\x13\x88\xc2\x57\x64\x18\xcd" \
+    "\xa0\x15\xf5\x20\xb4\xe6\xb5\x5b\xe1\x09\xdc\x06" \
+    "\x22\xb8\xe2\x2a\xcf\x31\x05\x6e\x18\xdf\xdf\xf8" \
+    "\x06\x06\xaa\x55\x1c\xc6\x35\x64\xc4\xdc\xf8\x0c" \
+    "\xd0\x20\x1d\x57\x7a\x5c\x85\xa8\x84\x5f\xdc\x02" \
+    "\x5e\xa5\x30\x7a\xfc\xcd\x07\xe2\x3a\x1d\xf2\x83" \
+    "\xec\x2b\x37\xd9\xad\x5f\xb4\xdf\xef\xd4\x9c\xfb" \
+    "\xf7\x2f\xac\x98\xc8\xcc\x89\x00\x00\x00\x00\x49" \
+    "\x45\x4e\x44\xae\x42\x60\x82"
+image6_data = \
+    "\x89\x50\x4e\x47\x0d\x0a\x1a\x0a\x00\x00\x00\x0d" \
+    "\x49\x48\x44\x52\x00\x00\x00\x16\x00\x00\x00\x16" \
+    "\x08\x06\x00\x00\x00\xc4\xb4\x6c\x3b\x00\x00\x00" \
+    "\xbf\x49\x44\x41\x54\x38\x8d\xd5\x93\x41\x0a\x83" \
+    "\x30\x10\x45\xdf\x48\x8e\xe5\x1d\xbc\x8c\x3b\xa9" \
+    "\x8b\xf4\x6a\x9e\xab\xd3\x85\x35\x0d\x26\x63\x62" \
+    "\x44\x4a\x3f\x0c\x42\x66\xfc\xf3\xf8\x24\xf0\x6f" \
+    "\x12\x40\x2b\x66\xda\x8c\x55\xf3\xde\x22\x12\xcf" \
+    "\x9d\x92\xcb\x98\xc0\xba\x2d\x7c\x45\x44\xcf\x9a" \
+    "\x07\x63\x8b\xba\xd5\x3c\x44\x91\x23\x5e\xcf\x7c" \
+    "\xc1\x62\x36\x97\xa9\x25\x40\xc1\x1f\xf4\xfd\xa7" \
+    "\x52\x75\x01\x5d\x24\xa9\x38\x9e\x7d\x6f\x53\xdf" \
+    "\x4f\xe4\xcc\xab\x32\x3e\xea\x0f\x03\xc0\xc4\xb2" \
+    "\xa0\x71\x2c\xe6\xad\xd8\x9b\x59\xb7\x66\x1c\x3b" \
+    "\xe0\x95\x98\x5f\x26\x16\x79\xee\x4e\xbc\xc2\x2c" \
+    "\x97\x88\x55\x1f\xe6\xa2\xcb\xc4\x96\x9a\x89\x4b" \
+    "\xcb\x6f\x23\xee\x36\x1a\xab\x62\xe2\x52\xc5\x72" \
+    "\x94\xdf\xbf\xb6\x10\xbb\xf2\xc8\x97\xb8\xa4\x6c" \
+    "\xc6\x67\x7e\xaa\x51\x95\x71\xfa\x08\x7e\xa8\x37" \
+    "\x62\xda\x9a\xba\xcb\x20\x23\x5f\x00\x00\x00\x00" \
+    "\x49\x45\x4e\x44\xae\x42\x60\x82"
+image7_data = \
+    "\x89\x50\x4e\x47\x0d\x0a\x1a\x0a\x00\x00\x00\x0d" \
+    "\x49\x48\x44\x52\x00\x00\x00\x16\x00\x00\x00\x16" \
+    "\x08\x06\x00\x00\x00\xc4\xb4\x6c\x3b\x00\x00\x00" \
+    "\xd5\x49\x44\x41\x54\x38\x8d\xc5\x95\x5d\x0a\x84" \
+    "\x30\x0c\x84\x27\xe2\xa9\x0a\x9e\x6c\x8b\x0f\x4b" \
+    "\x3d\xd9\x82\xd7\xca\x3e\x58\xd7\xfe\x4c\xd0\xba" \
+    "\x5d\x76\x40\x02\x4d\xf2\x65\xda\x0a\x05\x7e\x24" \
+    "\x39\xc9\xeb\x8d\x9e\xaa\x88\x41\xa0\xc9\xaa\xd8" \
+    "\xc8\x2a\xb3\x2f\x9c\x42\x5b\xe1\xe3\x0e\x0d\xcf" \
+    "\x00\xc0\x03\x08\xf0\xb3\xa7\xa0\x74\x10\xa9\xd7" \
+    "\x14\x2e\x00\xb4\x2c\x5a\x5f\xab\x69\x6b\x97\x9b" \
+    "\x1c\x83\x7f\xc0\xc3\x16\xb6\xe4\x16\x5b\x64\xf7" \
+    "\x8d\x71\x63\x59\x91\x9b\xdc\x45\x70\xde\x47\xc0" \
+    "\x47\x32\xdd\x5e\x5b\xcc\x35\xf0\xc9\x77\x62\xae" \
+    "\x78\x79\x36\xdc\xcf\x75\x13\x57\x7e\x79\xf4\x8c" \
+    "\x4b\x27\xaa\x0f\x13\x27\xb2\x40\xf5\x11\x7f\xcb" \
+    "\xe3\x48\xaa\x33\xb6\xe0\x22\x4b\x05\x4d\x07\x46" \
+    "\xb8\x02\x5e\x2e\x3b\x3e\x73\xcd\xe0\xdd\x1c\x97" \
+    "\xf0\x2e\x8e\xd9\xd0\xaf\x1d\xb3\x81\x22\x4b\xdf" \
+    "\x33\xee\xe6\x98\xa9\x34\xa0\xf6\x17\xb4\x55\x40" \
+    "\xd0\x0b\xcf\x4c\xa0\x8f\xc0\xdf\xf4\x06\xe3\x25" \
+    "\xc1\x98\x1b\xc4\x18\x76\x00\x00\x00\x00\x49\x45" \
+    "\x4e\x44\xae\x42\x60\x82"
+image8_data = \
+    "\x89\x50\x4e\x47\x0d\x0a\x1a\x0a\x00\x00\x00\x0d" \
+    "\x49\x48\x44\x52\x00\x00\x00\x16\x00\x00\x00\x16" \
+    "\x08\x06\x00\x00\x00\xc4\xb4\x6c\x3b\x00\x00\x02" \
+    "\x5d\x49\x44\x41\x54\x38\x8d\xd5\x93\xa1\x72\xdb" \
+    "\x40\x10\x86\x3f\x67\x0a\x56\xec\xc4\x22\x78\xd0" \
+    "\x65\x36\x93\xa0\xc2\x1c\x68\xd6\xc2\xe6\x0d\xf2" \
+    "\x1a\x81\x81\x11\x34\x94\x99\xc2\x54\xa8\x32\x9b" \
+    "\x55\xf0\xe0\x89\xdd\xb1\x5b\xa6\x02\xb7\x9d\x66" \
+    "\x92\xd6\x99\xb6\xd3\x99\xfe\xe8\x6e\x67\xe7\xdb" \
+    "\x7f\x77\xef\xe0\x7f\xd3\xe2\xc7\x4b\xd7\x75\xb3" \
+    "\x73\x0e\xef\x3d\x51\x15\x00\x23\x82\xb5\x16\x6b" \
+    "\x2d\x57\x57\x57\x8b\x17\x29\xbf\x02\xb7\x6d\x3b" \
+    "\x0f\x87\x03\xb9\x2d\x58\xae\xd7\x60\x04\x00\xef" \
+    "\x1c\xe3\xc7\x03\x06\xa8\xaa\x8a\xeb\xeb\xeb\x57" \
+    "\xc1\x17\xdf\xa0\x6d\xdb\x52\x5d\xd7\x54\xef\xb6" \
+    "\x00\xa8\x2a\x49\x13\x8a\x12\x35\x32\xec\x3a\xc4" \
+    "\x2b\x9b\xcd\xe6\x55\xce\x2f\xfa\xbe\x9f\x87\xc3" \
+    "\x40\xfd\xe1\x3d\xcb\x4d\x8d\xaa\xa2\x4e\x48\xee" \
+    "\x12\xc6\x82\x38\x08\xc1\x07\x96\x9b\x1a\x8a\x9c" \
+    "\xe3\xf1\xf8\xaa\x51\x5c\x38\xe7\xc8\xad\xa5\xaa" \
+    "\x6b\x00\xc4\x5f\x12\x9c\x67\xd2\x23\x93\x8c\x88" \
+    "\xe6\xc8\x60\xd1\x18\xb1\xd5\x92\xd1\x39\xba\xae" \
+    "\x9b\xcf\x83\xa7\x89\x65\xb5\x46\x51\x34\x80\x1b" \
+    "\x1d\x2e\x1f\x49\x45\xc0\xe3\x50\x09\x64\x08\xea" \
+    "\x15\x44\x90\xc2\xe0\xbd\x3f\xef\x58\x53\xc2\xe4" \
+    "\x86\xa0\x01\x9f\x4d\x84\xf5\x84\x18\x41\x83\x62" \
+    "\xb0\x40\x8e\x8b\x23\xc9\x24\x50\x10\x93\x31\x4d" \
+    "\xd3\x59\xf0\x1b\x80\x98\x14\x11\x20\x25\x14\x40" \
+    "\x15\xf1\x96\x4c\x0b\xbc\x1b\x48\x4b\x07\xe4\x68" \
+    "\x88\x80\xc0\x29\xeb\xd7\x8e\x41\x41\xf5\xb4\x34" \
+    "\xfd\x76\x86\x4c\x05\x3f\x1e\x08\x4b\x0f\x85\x80" \
+    "\x26\x54\x40\x63\x40\x44\xce\x83\x8b\xbc\xc0\x39" \
+    "\x87\xa6\x13\x50\xa3\xa2\x28\x5e\x1d\x5a\x44\x14" \
+    "\xd0\x70\x8a\xa5\x98\x08\x21\x62\xad\x3d\x0f\xb6" \
+    "\xd6\xe2\x87\xcf\xa4\x98\x50\x8d\x27\x40\x50\x44" \
+    "\x73\x70\x42\x8c\x91\xaf\x8d\x10\xfd\x44\x81\x60" \
+    "\x8c\x39\x0b\x5e\x00\xdc\xdd\xdd\xcd\x8e\x80\xa9" \
+    "\xde\x42\x02\x48\xe8\x04\x84\x08\x56\xf0\x3e\x02" \
+    "\x90\x7d\x72\x94\x65\xc9\xba\x5a\xe3\x46\x87\x31" \
+    "\xe6\xa7\x9f\xe5\x02\x60\xb5\x5a\x61\x02\xc4\xee" \
+    "\x40\xa6\x89\x4c\x33\xf2\xcb\x0c\xb1\x06\x51\x28" \
+    "\x14\xf8\xf8\x99\xb2\x2c\xb9\xb9\xb9\x59\xb8\xd1" \
+    "\xf1\xf8\xf8\x48\xd3\x34\xb4\x6d\xfb\xe2\x9b\xfe" \
+    "\x5e\xad\xef\xfb\xf9\x78\x3c\x32\x3a\x87\x18\x81" \
+    "\xec\xb4\x20\x0d\x11\x51\xa8\xeb\x9a\xed\x76\xbb" \
+    "\x00\x18\x86\x61\xee\xba\x8e\xfd\x7e\x8f\x31\x86" \
+    "\xed\x76\xcb\x6a\xb5\x7a\xe2\xfe\x59\x1b\x5d\xd7" \
+    "\xcd\xde\x7b\x62\x8c\x88\x08\x79\x9e\x63\xad\xa5" \
+    "\xaa\xaa\x67\xb9\xbb\xdd\x6e\x6e\x9a\x06\xef\x3d" \
+    "\x75\x5d\x3f\x29\xfe\xc7\xea\xfb\x7e\xbe\xbd\xbd" \
+    "\x9d\xad\xb5\x73\x59\x96\xf3\xfd\xfd\xfd\xfc\xa2" \
+    "\xe3\xdf\xd5\xc3\xc3\xc3\xdc\x34\x0d\xd3\x34\xb1" \
+    "\xd9\x6c\xfe\x1e\x18\x4e\x63\xdc\xef\xf7\xa4\x94" \
+    "\xfe\x26\xf6\x1f\xe9\x0b\xbc\x4c\x5e\x59\xd6\x14" \
+    "\xca\xf4\x00\x00\x00\x00\x49\x45\x4e\x44\xae\x42" \
+    "\x60\x82"
+
+class Eficas(QMainWindow):
+    def __init__(self,parent = None,name = None,fl = 0):
+        QMainWindow.__init__(self,parent,name,fl)
+        self.statusBar()
+
+        self.image0 = QPixmap()
+        self.image0.loadFromData(image0_data,"PNG")
+        self.image1 = QPixmap()
+        self.image1.loadFromData(image1_data,"PNG")
+        self.image2 = QPixmap()
+        self.image2.loadFromData(image2_data,"PNG")
+        self.image3 = QPixmap()
+        self.image3.loadFromData(image3_data,"PNG")
+        self.image4 = QPixmap()
+        self.image4.loadFromData(image4_data,"PNG")
+        self.image5 = QPixmap()
+        self.image5.loadFromData(image5_data,"PNG")
+        self.image6 = QPixmap()
+        self.image6.loadFromData(image6_data,"PNG")
+        self.image7 = QPixmap()
+        self.image7.loadFromData(image7_data,"PNG")
+        self.image8 = QPixmap()
+        self.image8.loadFromData(image8_data,"PNG")
+        if not name:
+            self.setName("Eficas")
+
+        self.setEnabled(1)
+        self.setMinimumSize(QSize(902,575))
+        self.setBackgroundOrigin(QMainWindow.WidgetOrigin)
+        f = QFont(self.font())
+        self.setFont(f)
+
+        self.setCentralWidget(QWidget(self,"qt_central_widget"))
+
+        self.line1 = QFrame(self.centralWidget(),"line1")
+        self.line1.setGeometry(QRect(-30,-10,930,20))
+        self.line1.setFrameShape(QFrame.HLine)
+        self.line1.setFrameShadow(QFrame.Sunken)
+        self.line1.setFrameShape(QFrame.HLine)
+
+        self.fileNewAction = QAction(self,"fileNewAction")
+        self.fileNewAction.setIconSet(QIconSet(self.image0))
+        self.fileOpenAction = QAction(self,"fileOpenAction")
+        self.fileOpenAction.setIconSet(QIconSet(self.image1))
+        self.fileSaveAction = QAction(self,"fileSaveAction")
+        self.fileSaveAction.setIconSet(QIconSet(self.image2))
+        self.fileSaveAsAction = QAction(self,"fileSaveAsAction")
+        self.fileExitAction = QAction(self,"fileExitAction")
+        self.editUndoAction = QAction(self,"editUndoAction")
+        self.editUndoAction.setIconSet(QIconSet(self.image3))
+        self.editRedoAction = QAction(self,"editRedoAction")
+        self.editRedoAction.setIconSet(QIconSet(self.image4))
+        self.editCutAction = QAction(self,"editCutAction")
+        self.editCutAction.setIconSet(QIconSet(self.image5))
+        self.editCopyAction = QAction(self,"editCopyAction")
+        self.editCopyAction.setIconSet(QIconSet(self.image6))
+        self.editPasteAction = QAction(self,"editPasteAction")
+        self.editPasteAction.setIconSet(QIconSet(self.image7))
+        self.editFindAction = QAction(self,"editFindAction")
+        self.editFindAction.setIconSet(QIconSet(self.image8))
+        self.helpContentsAction = QAction(self,"helpContentsAction")
+        self.helpIndexAction = QAction(self,"helpIndexAction")
+        self.helpAboutAction = QAction(self,"helpAboutAction")
+        self.traductionnew_itemAction = QAction(self,"traductionnew_itemAction")
+        self.fileSaveCloseAction = QAction(self,"fileSaveCloseAction")
+        self.fileCloseAction = QAction(self,"fileCloseAction")
+        self.fileNewViewAction = QAction(self,"fileNewViewAction")
+        self.fileCloseAllAction = QAction(self,"fileCloseAllAction")
+        self.jdcRapportDeValidationAction = QAction(self,"jdcRapportDeValidationAction")
+        self.jdcFichierSourceAction = QAction(self,"jdcFichierSourceAction")
+
+
+        self.toolBar = QToolBar(QString(""),self,Qt.DockTop)
+
+        self.toolBar.setFrameShape(QToolBar.MenuBarPanel)
+        self.toolBar.setHorizontallyStretchable(0)
+        self.fileNewAction.addTo(self.toolBar)
+        self.fileSaveAction.addTo(self.toolBar)
+        self.fileOpenAction.addTo(self.toolBar)
+        self.fileSaveAsAction.addTo(self.toolBar)
+        self.editCutAction.addTo(self.toolBar)
+        self.editPasteAction.addTo(self.toolBar)
+        self.editFindAction.addTo(self.toolBar)
+        self.fileExitAction.addTo(self.toolBar)
+
+
+        self.MenuBar = QMenuBar(self,"MenuBar")
+
+        self.MenuBar.setMargin(2)
+
+        self.Fichier = QPopupMenu(self)
+        self.fileNewAction.addTo(self.Fichier)
+        self.fileNewViewAction.addTo(self.Fichier)
+        self.fileOpenAction.addTo(self.Fichier)
+        self.fileSaveAction.addTo(self.Fichier)
+        self.fileSaveAsAction.addTo(self.Fichier)
+        self.fileCloseAction.addTo(self.Fichier)
+        self.fileCloseAllAction.addTo(self.Fichier)
+        self.Fichier.insertSeparator()
+        self.Fichier.insertSeparator()
+        self.fileExitAction.addTo(self.Fichier)
+        self.MenuBar.insertItem(QString(""),self.Fichier,2)
+
+        self.Edition = QPopupMenu(self)
+        self.Edition.insertSeparator()
+        self.editCutAction.addTo(self.Edition)
+        self.editCopyAction.addTo(self.Edition)
+        self.editPasteAction.addTo(self.Edition)
+        self.Edition.insertSeparator()
+        self.editFindAction.addTo(self.Edition)
+        self.MenuBar.insertItem(QString(""),self.Edition,3)
+
+        self.JdC = QPopupMenu(self)
+        self.jdcRapportDeValidationAction.addTo(self.JdC)
+        self.jdcFichierSourceAction.addTo(self.JdC)
+        self.MenuBar.insertItem(QString(""),self.JdC,4)
+
+        self.Options = QPopupMenu(self)
+        self.MenuBar.insertItem(QString(""),self.Options,5)
+
+        self.Aide = QPopupMenu(self)
+        self.MenuBar.insertItem(QString(""),self.Aide,6)
+
+        self.Traduction = QPopupMenu(self)
+        self.traductionnew_itemAction.addTo(self.Traduction)
+        self.MenuBar.insertItem(QString(""),self.Traduction,7)
+
+        self.Patrons = QPopupMenu(self)
+        self.MenuBar.insertItem(QString(""),self.Patrons,8)
+
+
+        self.languageChange()
+
+        self.resize(QSize(902,575).expandedTo(self.minimumSizeHint()))
+        self.clearWState(Qt.WState_Polished)
+
+        self.connect(self.fileNewAction,SIGNAL("activated()"),self.fileNew)
+        self.connect(self.fileOpenAction,SIGNAL("activated()"),self.fileOpen)
+        self.connect(self.fileSaveAction,SIGNAL("activated()"),self.fileSave)
+        self.connect(self.fileSaveAsAction,SIGNAL("activated()"),self.fileSaveAs)
+        self.connect(self.fileExitAction,SIGNAL("activated()"),self.fileExit)
+        self.connect(self.editUndoAction,SIGNAL("activated()"),self.editUndo)
+        self.connect(self.editRedoAction,SIGNAL("activated()"),self.editRedo)
+        self.connect(self.editCutAction,SIGNAL("activated()"),self.editCut)
+        self.connect(self.editPasteAction,SIGNAL("activated()"),self.editPaste)
+        self.connect(self.editFindAction,SIGNAL("activated()"),self.editFind)
+        self.connect(self.helpIndexAction,SIGNAL("activated()"),self.helpIndex)
+        self.connect(self.helpContentsAction,SIGNAL("activated()"),self.helpContents)
+        self.connect(self.helpAboutAction,SIGNAL("activated()"),self.helpAbout)
+        self.connect(self.fileCloseAction,SIGNAL("activated()"),self.fileClose)
+        self.connect(self.fileNewViewAction,SIGNAL("activated()"),self.fileNewView)
+        self.connect(self.fileCloseAllAction,SIGNAL("activated()"),self.fileCloseAll)
+        self.connect(self.editCopyAction,SIGNAL("activated()"),self.editCopy)
+        self.connect(self.jdcRapportDeValidationAction,SIGNAL("activated()"),self.jdcRapport)
+        self.connect(self.jdcFichierSourceAction,SIGNAL("activated()"),self.jdcFichierSource)
+
+
+    def languageChange(self):
+        self.setCaption(self.__tr("Eficas "))
+        self.fileNewAction.setText(self.__tr("New"))
+        self.fileNewAction.setMenuText(self.__tr("&New"))
+        self.fileNewAction.setAccel(self.__tr("Ctrl+N"))
+        self.fileOpenAction.setText(self.__tr("Open"))
+        self.fileOpenAction.setMenuText(self.__tr("&Open..."))
+        self.fileOpenAction.setAccel(self.__tr("Ctrl+O"))
+        self.fileSaveAction.setText(self.__tr("Save"))
+        self.fileSaveAction.setMenuText(self.__tr("&Save"))
+        self.fileSaveAction.setAccel(self.__tr("Ctrl+S"))
+        self.fileSaveAsAction.setText(self.__tr("Save As"))
+        self.fileSaveAsAction.setMenuText(self.__tr("Save &As..."))
+        self.fileSaveAsAction.setAccel(QString.null)
+        self.fileExitAction.setText(self.__tr("Exit"))
+        self.fileExitAction.setMenuText(self.__tr("E&xit"))
+        self.fileExitAction.setAccel(QString.null)
+        self.editUndoAction.setText(self.__tr("Undo"))
+        self.editUndoAction.setMenuText(self.__tr("&Undo"))
+        self.editUndoAction.setAccel(self.__tr("Ctrl+Z"))
+        self.editRedoAction.setText(self.__tr("Redo"))
+        self.editRedoAction.setMenuText(self.__tr("&Redo"))
+        self.editRedoAction.setAccel(self.__tr("Ctrl+Y"))
+        self.editCutAction.setText(self.__tr("Cut"))
+        self.editCutAction.setMenuText(self.__tr("Cu&t"))
+        self.editCutAction.setAccel(self.__tr("Ctrl+X"))
+        self.editCopyAction.setText(self.__tr("Copy"))
+        self.editCopyAction.setMenuText(self.__tr("&Copy"))
+        self.editCopyAction.setAccel(self.__tr("Ctrl+C"))
+        self.editPasteAction.setText(self.__tr("Paste"))
+        self.editPasteAction.setMenuText(self.__tr("&Paste"))
+        self.editPasteAction.setAccel(self.__tr("Ctrl+V"))
+        self.editFindAction.setText(self.__tr("Find"))
+        self.editFindAction.setMenuText(self.__tr("&Find..."))
+        self.editFindAction.setAccel(self.__tr("Ctrl+F"))
+        self.helpContentsAction.setText(self.__tr("Contents"))
+        self.helpContentsAction.setMenuText(self.__tr("&Contents..."))
+        self.helpContentsAction.setAccel(QString.null)
+        self.helpIndexAction.setText(self.__tr("Index"))
+        self.helpIndexAction.setMenuText(self.__tr("&Index..."))
+        self.helpIndexAction.setAccel(QString.null)
+        self.helpAboutAction.setText(self.__tr("About"))
+        self.helpAboutAction.setMenuText(self.__tr("&About"))
+        self.helpAboutAction.setAccel(QString.null)
+        self.traductionnew_itemAction.setText(self.__tr("new item"))
+        self.traductionnew_itemAction.setMenuText(self.__tr("new item"))
+        self.fileSaveCloseAction.setText(self.__tr("Close"))
+        self.fileSaveCloseAction.setMenuText(self.__tr("Close"))
+        self.fileCloseAction.setText(self.__tr("Close"))
+        self.fileCloseAction.setMenuText(self.__tr("Close"))
+        self.fileCloseAction.setAccel(self.__tr("Ctrl+W"))
+        self.fileNewViewAction.setText(self.__tr("New view"))
+        self.fileCloseAllAction.setText(self.__tr("Close All"))
+        self.fileCloseAllAction.setMenuText(self.__tr("Close All"))
+        self.jdcRapportDeValidationAction.setText(self.__tr("Rapport de validation"))
+        self.jdcRapportDeValidationAction.setMenuText(self.__tr("Rapport de validation"))
+        self.jdcRapportDeValidationAction.setAccel(self.__tr("Ctrl+R"))
+        self.jdcFichierSourceAction.setText(self.__tr("Fichier source"))
+        self.jdcFichierSourceAction.setMenuText(self.__tr("Fichier source"))
+        self.jdcFichierSourceAction.setAccel(self.__tr("Ctrl+B"))
+        self.toolBar.setLabel(self.__tr("Tools"))
+        if self.MenuBar.findItem(2):
+            self.MenuBar.findItem(2).setText(self.__tr("&Fichier"))
+        if self.MenuBar.findItem(3):
+            self.MenuBar.findItem(3).setText(self.__tr("&Edition"))
+        if self.MenuBar.findItem(4):
+            self.MenuBar.findItem(4).setText(self.__tr("JdC"))
+        if self.MenuBar.findItem(5):
+            self.MenuBar.findItem(5).setText(self.__tr("Options"))
+        if self.MenuBar.findItem(6):
+            self.MenuBar.findItem(6).setText(self.__tr("&Aide"))
+        if self.MenuBar.findItem(7):
+            self.MenuBar.findItem(7).setText(self.__tr("Traduction"))
+        if self.MenuBar.findItem(8):
+            self.MenuBar.findItem(8).setText(self.__tr("Patrons"))
+
+
+    def fileNew(self):
+        print "Eficas.fileNew(): Not implemented yet"
+
+    def fileOpen(self):
+        print "Eficas.fileOpen(): Not implemented yet"
+
+    def fileSave(self):
+        print "Eficas.fileSave(): Not implemented yet"
+
+    def fileSaveAs(self):
+        print "Eficas.fileSaveAs(): Not implemented yet"
+
+    def filePrint(self):
+        print "Eficas.filePrint(): Not implemented yet"
+
+    def fileExit(self):
+        print "Eficas.fileExit(): Not implemented yet"
+
+    def editUndo(self):
+        print "Eficas.editUndo(): Not implemented yet"
+
+    def editRedo(self):
+        print "Eficas.editRedo(): Not implemented yet"
+
+    def jdcFichierSource(self):
+        print "Eficas.jdcFichierSource(): Not implemented yet"
+
+    def fileNewView(self):
+        print "Eficas.fileNewView(): Not implemented yet"
+
+    def editPaste(self):
+        print "Eficas.editPaste(): Not implemented yet"
+
+    def editFind(self):
+        print "Eficas.editFind(): Not implemented yet"
+
+    def helpIndex(self):
+        print "Eficas.helpIndex(): Not implemented yet"
+
+    def helpContents(self):
+        print "Eficas.helpContents(): Not implemented yet"
+
+    def helpAbout(self):
+        print "Eficas.helpAbout(): Not implemented yet"
+
+    def fileClose(self):
+        print "Eficas.fileClose(): Not implemented yet"
+
+    def fileCloseAll(self):
+        print "Eficas.fileCloseAll(): Not implemented yet"
+
+    def jdcRapport(self):
+        print "Eficas.jdcRapport(): Not implemented yet"
+
+    def editCut(self):
+        print "Eficas.editCut(): Not implemented yet"
+
+    def editCopy(self):
+        print "Eficas.editCopy(): Not implemented yet"
+
+    def __tr(self,s,c = None):
+        return qApp.translate("Eficas",s,c)
diff --git a/InterfaceQT/panelsQT.py b/InterfaceQT/panelsQT.py
new file mode 100644 (file)
index 0000000..cc2125f
--- /dev/null
@@ -0,0 +1,28 @@
+# -*- coding: utf-8 -*-
+import string
+import os
+
+import traceback
+
+from qt import *
+from qtCommun import QTPanel
+from desInactif import DInactif
+
+
+SEPARATEUR = '-'*30
+
+      
+class PanelInactif( QTPanel, DInactif ):   
+    def __init__(self,node,parent=None ):
+        DInactif.__init__(self,parent)
+        QTPanel.__init__(self,node,parent)
+                
+        
+class NoPanel( QWidget ):
+    def __init__(self,parent = None,name = None,fl = 0):
+        QWidget.__init__(self,parent,name,fl)
+        self.textLabel = QLabel(self)
+        self.textLabel.setText(QString("PANNEAU A IMPLEMENTER"))
+        self.textLabel.setGeometry(QRect(130,150,219,17))
+        self.resize(QSize(600,480).expandedTo(self.minimumSizeHint()))
+        
diff --git a/InterfaceQT/politiquesValidation.py b/InterfaceQT/politiquesValidation.py
new file mode 100644 (file)
index 0000000..dd04a65
--- /dev/null
@@ -0,0 +1,148 @@
+# -*- 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
+
+
+#------------------
+class Validation  :
+#------------------
+  def __init__(self,node,parent) :
+         self.node=node
+         self.parent=parent
+
+  def TesteUneValeur(self,valeurentree):
+         valeur,validite=self.node.item.eval_valeur(valeurentree)
+         if not validite :
+                  commentaire = "impossible d'évaluer : %s " %`valeurentree`
+                  return valeur,validite,commentaire
+
+         testtype,commentaire = self.node.item.object.verif_type(valeur)
+         if not testtype :
+                  return valeur,0,commentaire
+
+         valide=self.node.item.valide_item(valeur)
+         if type(valide) == types.TupleType:
+                 validite,commentaire=valide
+         else :
+                 validite=valide
+                 commentaire=" "
+
+         if not validite :
+                  commentaire = "impossible d'évaluer : %s " %`valeurentree`
+         return valeur, validite, commentaire
+
+# ----------------------------------------------------------------------------------------
+#   Méthodes utilisées pour la manipulation des items en notation scientifique
+#   a mettre au point
+# ----------------------------------------------------------------------------------------
+  def SetValeurTexte(self,texteValeur) :
+         try :
+                  if "R" in self.node.item.object.definition.type:
+                     if texteValeur[0] != "'":
+                        clef=eval(texteValeur)
+                        if str(clef) != str(texteValeur) :
+                           self.node.item.object.init_modif()
+                           clefobj=self.node.item.object.GetNomConcept()
+                           if not self.parent.dict_reels.has_key(clefobj):
+                              self.parent.dict_reels[clefobj] = {}
+                           self.parent.dict_reels[clefobj][clef]=texteValeur
+                           self.parent.dict_reels[clefobj]
+                           self.node.item.object.fin_modif()
+         except:
+            pass
+
+  def GetValeurTexte(self,valeur) :
+         valeurTexte=valeur
+         if "R" in self.node.item.object.definition.type:
+                  clefobj=self.node.item.object.GetNomConcept()
+                  if self.parent.dict_reels.has_key(clefobj):
+                     if self.parent.dict_reels[clefobj].has_key(valeur):
+                        valeurTexte=self.parent.dict_reels[clefobj][valeur]
+         return valeurTexte
+
+#------------------------------------
+class PolitiqueUnique(Validation) :
+#------------------------------------
+  """
+  classe servant pour les entrees ne demandant qu un mot clef
+  """
+  def __init__(self,node,parent):
+        Validation.__init__(self,node,parent)
+
+  def RecordValeur(self,valeurentree):
+         if self.parent.modified == 'n' : self.parent.init_modif()
+         ancienne_val = self.node.item.get_valeur()
+         valeur,validite,commentaire =self.TesteUneValeur(valeurentree)
+         if validite :
+            validite=self.node.item.set_valeur(valeur)
+            if self.node.item.isvalid():
+                  commentaire = "Valeur du mot-clé enregistrée"
+                  self.SetValeurTexte(str(valeurentree))
+            else:
+                  cr = self.node.item.get_cr()
+                  commentaire =  "Valeur du mot-clé non autorisée "+cr.get_mess_fatal()
+                  self.node.item.set_valeur(ancienne_val)
+         return validite, commentaire 
+
+#------------------------
+class PolitiquePlusieurs:
+#------------------------
+  """
+  classe servant pour les entrees ne demandant qu un mot clef
+  """
+  def __init__(self,node,parent) :
+         self.node=node
+         self.parent=parent
+
+
+  def AjoutValeurs(self,listevaleur,index,listecourante):
+         listeRetour=[]
+         commentaire="Nouvelle valeur acceptée"
+         commentaire2=""
+         valide=1
+         for valeur in listevaleur :
+             # On teste le type de la valeur
+             valide=self.node.item.valide_item(valeur)
+             if not valide:
+                commentaire="Valeur "+str(valeur)+ "incorrecte : ajout à la liste refusé"
+                commentaire2=self.node.item.info_erreur_item()
+                return valide,commentaire,commentaire2,listeRetour
+
+             # On valide la liste obtenue
+             encorevalide=self.node.item.valide_liste_partielle(valeur,listecourante)
+             if not encorevalide :
+                commentaire2=self.node.item.info_erreur_liste()
+                # On traite le cas ou la liste n est pas valide pour un pb de cardinalite
+                min,max = self.node.item.GetMinMax()
+                if len(listecourante) + 1 >= max :
+                   commentaire="La liste a déjà atteint le nombre maximum d'éléments,ajout refusé"
+                   return valide,commentaire,commentaire2,listeRetour
+                if len(listecourante) + 1 > min :
+                   return valide,commentaire,commentaire2,listeRetour
+              
+             # On ajoute la valeur testee a la liste courante et a la liste acceptee
+             listecourante.insert(index,valeur)
+             index=index+1
+             listeRetour.append(valeur)
+
+         return valide,commentaire,commentaire2,listeRetour
diff --git a/InterfaceQT/prefsQT.py b/InterfaceQT/prefsQT.py
new file mode 100644 (file)
index 0000000..ef1aa89
--- /dev/null
@@ -0,0 +1,25 @@
+# -*- 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.
+#
+#
+# ======================================================================
+
+lang='fr'
+
diff --git a/InterfaceQT/qtCommun.py b/InterfaceQT/qtCommun.py
new file mode 100644 (file)
index 0000000..d050260
--- /dev/null
@@ -0,0 +1,296 @@
+# -*- 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
+import traceback
+
+from qt import *
+from InterfaceQT import prefsQT
+
+# Import des panels
+
+# ---------- #
+class QTPanel:
+# ---------- #
+  """
+  Classe contenant les méthodes Qt communes a tous les panneaux droits
+  Tous les panneaux Mon...Panel héritent de cette classe
+  Gére plus précisement :
+     - l affichage de la doc
+     - le bouton Suppression (BSupPressed)
+     - la mutualisation de l affichage des regles
+  """
+  def __init__(self,node, parent = None):
+        self.editor    = parent
+        self.node      = node
+        
+  def BSupPressed(self):
+        self.editor.init_modif()
+        self.node.delete()
+        
+  def BOkPressed(self):
+        """ Impossible d utiliser les vrais labels avec designer ?? """
+        label=self.TWChoix.tabLabel(self.TWChoix.currentPage())
+        if label==QString("Nouvelle Commande"):
+           self.DefCmd()
+        if label==QString("Nommer Concept"):
+           self.LENomConceptReturnPressed()
+        if label==QString("Ajouter Mot-Clef"):
+           self.DefMC()
+        if label==QString("Définition Formule"):
+           self.BOkPressedFormule()
+
+  def AppelleBuildLBRegles(self):
+        listeRegles     = self.node.item.get_regles()
+        listeNomsEtapes = self.node.item.get_mc_presents()
+        self.BuildLBRegles(listeRegles,listeNomsEtapes)
+
+
+  def BuildLBRegles(self,listeRegles,listeNomsEtapes):
+        if len(listeRegles) > 0:
+           for regle in listeRegles :
+              texteRegle=regle.gettext()
+              texteMauvais,test = regle.verif(listeNomsEtapes)
+              for ligne in texteRegle.split("\n") :
+                 if ligne == "" :
+                    self.LBRegles.insertItem(ligne)
+                    continue
+                 if ligne[0]=="\t" :
+                    ligne="     "+ligne[1:]
+                 if test :
+                    self.LBRegles.insertItem(ligne)
+                 else :
+                    self.LBRegles.insertItem(itemColore(ligne))
+
+
+# ----------------------- #
+class QTPanelTBW1(QTPanel):
+# ----------------------- #
+  """
+  Classe contenant les méthodes nécessaires a l onglet "Ajouter Mot-Clef"  
+  hérite de QTPanel  # Attention n appelle pas le __init__
+  Gére plus précisement :
+  """
+  def __init__(self,node, parent = None):
+        self.editor    = parent
+        self.node      = node
+        self.BuildLBMCPermis()
+        self.AppelleBuildLBRegles()
+
+  def BuildLBMCPermis(self):
+        self.LBMCPermis.clear()
+        try :
+           QObject.disconnect(self.LBMCPermis,SIGNAL("doubleClicked(QListBoxItem*)"),self.DefMC)
+        except :
+           # normal pour la première fois qu on passe
+           # peut-etre inutile selon le connect ??
+           pass
+        QObject.connect(self.LBMCPermis,SIGNAL("doubleClicked(QListBoxItem*)"),self.DefMC)
+
+        jdc = self.node.item.get_jdc()
+        genea =self.node.item.get_genealogie()
+        liste_mc=self.node.item.get_liste_mc_ordonnee(genea,jdc.cata_ordonne_dico)
+        for aMc in liste_mc:
+           self.LBMCPermis.insertItem( aMc)
+
+
+  def DefMC(self):
+        """ On ajoute un mot-clé à  la commande : subnode """
+        name=str(self.LBMCPermis.selectedItem().text())
+        self.editor.init_modif()
+        self.node.append_child(name)
+
+# ---------------------------- #
+class QTPanelTBW2(QTPanel):
+# ---------------------------- #
+  """
+  Classe contenant les méthodes nécessaires a l onglet "Nouvelle Commande"  
+  hérite de QTPanel  # Attention n appelle pas le __init__
+  Gére plus précisement :
+  """
+
+  def __init__(self,node, parent = None):
+        self.editor    = parent
+        self.node      = node
+        self.BuildLBNouvCommande()
+        self.AppelleBuildLBRegles()
+
+      
+  def BuildLBNouvCommande(self):
+        self.LBNouvCommande.clear()
+        try :
+           QObject.disconnect(self.LBNouvCommande,SIGNAL("doubleClicked(QListBoxItem*)"),self.DefCmd)
+        except :
+           # normal pour la première fois qu on passe
+           # peut-etre inutile selon le connect ??
+           pass
+
+        jdc=self.node.item.object.get_jdc_root()
+        if self.RBalpha.isOn():
+           listeCmd = jdc.get_liste_cmd()
+           for aCmd in listeCmd:
+              self.LBNouvCommande.insertItem( aCmd )
+        else :
+           listeGroupes,dictGroupes=jdc.get_groups()
+           for grp in listeGroupes:
+              if grp == "CACHE":continue
+              listeCmd=dictGroupes[grp]
+              texte="GROUPE : "+grp
+              self.LBNouvCommande.insertItem( texte )
+              self.LBNouvCommande.insertItem( " " )
+              for aCmd in listeCmd:
+                 self.LBNouvCommande.insertItem( aCmd)
+              self.LBNouvCommande.insertItem( " " )
+        QObject.connect( self.LBNouvCommande, SIGNAL("doubleClicked(QListBoxItem*)"),self.DefCmd )
+
+  def DefCmd(self):
+        name=str(self.LBNouvCommande.selectedItem().text())
+        if name==QString(" "):
+          return
+        if name.find("GROUPE :")==0 :
+          return
+        self.editor.init_modif()
+        new_node = self.node.append_brother(name,'after')
+
+
+  def LEFiltreTextChanged(self):
+        MonItem=self.LBNouvCommande.findItem(self.LEFiltre.text().upper(),Qt.Contains)
+       if MonItem != None :
+          self.LBNouvCommande.setCurrentItem(MonItem)
+          self.LBNouvCommande.setSelected(MonItem,1)
+
+  def LEfiltreReturnPressed(self):
+        self.DefCmd()
+
+  def BNextPressed(self):
+        self.LBNouvCommande.setCurrentItem(self.LBNouvCommande.currentItem()+1)
+        self.LEFiltreTextChanged()
+
+  def LBNouvCommandeClicked(self):
+        name=str(self.LBNouvCommande.currentText())
+
+
+# ---------------------------- #
+class QTPanelTBW3(QTPanel):
+# ---------------------------- #
+
+  """
+  Classe contenant les méthodes nécessaires a l onglet "Nommer Concept"  
+  si non réentrant
+  hérite de QTPanel                   # Attention n appelle pas le __init__
+  Gére plus précisement :
+  """
+
+  def __init__(self,node, parent = None):
+        self.editor    = parent
+        self.node      = node
+        type_sd = self.node.item.get_type_sd_prod()
+        nomConcept = self.node.item.GetText()
+        self.typeConcept.setText(type_sd)
+        self.LENomConcept.setText("")
+        self.LENomConcept.setText(nomConcept)
+        
+
+
+  def LENomConceptReturnPressed(self):
+        """
+        Nomme le concept SD retourne par l'etape
+        """
+        nom = str(self.LENomConcept.text())
+        nom = string.strip(nom)
+
+        if nom == '' : return                  # si pas de nom, on ressort sans rien faire
+
+        self.editor.init_modif()
+        test,mess = self.node.item.nomme_sd(nom)
+        self.editor.affiche_infos(mess)
+
+# ----------------------- #
+class ViewText(QDialog):
+# ----------------------- #
+    """
+    Classe permettant la visualisation de texte
+    """
+    def __init__(self,parent = None,name = None,modal = 0,fl = 0):
+        QDialog.__init__(self,parent,name,modal,fl)
+        
+        l1 = QVBoxLayout(self,11,6,)
+        self.view = QTextEdit(self)
+        self.view.setReadOnly(True)
+
+        l2 = QHBoxLayout(None,0,6)
+        Horizontal_Spacing2 = QSpacerItem(220,20,QSizePolicy.Expanding,QSizePolicy.Minimum)                
+        bclose= QPushButton(self)
+        bclose.setText(self.trUtf8( "Fermer"))
+        bsave= QPushButton(self)
+        bsave.setText(self.trUtf8( "Sauver"))
+        l2.addItem(Horizontal_Spacing2)
+        l2.addWidget(bsave)
+        l2.addWidget(bclose)
+                
+        l1.addWidget(self.view)        
+        l1.addLayout(l2)
+
+        self.resize( QSize(600,507).expandedTo(self.minimumSizeHint()) )
+        self.connect( bclose,SIGNAL("clicked()"), self, SLOT("close()") )
+        self.connect( bsave,SIGNAL("clicked()"), self.saveFile )
+        
+    def setText(self, txt ):    
+        self.view.setText(txt)
+        
+    def saveFile(self):
+        #recuperation du nom du fichier
+        fn = QFileDialog.getSaveFileName(None,
+                self.trUtf8("All Files (*)"), self, None,
+                self.trUtf8("Save File"), '', 0)                
+        if not fn.isNull():                
+           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
+           fn = unicode(QDir.convertSeparators(fn))                
+        else:
+           return
+
+        #ecriture du fichier
+        try:
+           f = open(fn, 'wb')
+           f.write(str(self.view.text()))
+           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
+
+
+#-------------------------------
+class itemColore(QListBoxText):
+#-------------------------------
+    def paint(self,p):
+        p.setPen(Qt.red)
+        QListBoxText.paint(self,p);
diff --git a/InterfaceQT/qtEficas.py b/InterfaceQT/qtEficas.py
new file mode 100644 (file)
index 0000000..a94621b
--- /dev/null
@@ -0,0 +1,206 @@
+"""
+
+"""
+import os, sys
+REPINI=os.path.dirname(os.path.abspath(__file__))
+INSTALLDIR=os.path.join(REPINI,'..')
+sys.path.append(INSTALLDIR)
+sys.path.append(INSTALLDIR+"/Ui")
+
+from qt import *
+from myMain_ui import Eficas
+from viewManager import MyTabview
+
+from Editeur import configuration
+from Aster   import prefs
+from InterfaceQT import utilIcons
+utilIcons.initializeMimeSourceFactory()
+
+class Appli(Eficas):    
+    """
+    Class implementing the main user interface.
+    """
+    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)
+
+        self.top=self
+        self.CONFIGURATION = configuration.make_config(self,prefs.REPINI)
+        self.CONFIGStyle = configuration.make_config_style(self,prefs.REPINI)
+
+        self.viewmanager = MyTabview(self, self) #MyTabview, MyWorkspace, Listspace
+        self.setCentralWidget(self.viewmanager)
+
+        self.recentMenu = QPopupMenu(self.Fichier)
+        self.Fichier.insertItem(self.trUtf8('Open &Recent Files'), self.recentMenu)
+        self.connect(self.recentMenu,SIGNAL('aboutToShow()'),self.handleShowRecentMenu)
+        
+
+        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)
+        self.ficPatrons={}
+        self.initPatrons()
+        self.ihm="QT"
+        
+        
+    def initPatrons(self) :
+        from Editeur import listePatrons
+        self.listePatrons = listePatrons.listePatrons()
+        idx = 0
+        for nomSsMenu in self.listePatrons.liste.keys():
+            ssmenu = QPopupMenu(self.Patrons)
+            self.Patrons.insertItem(nomSsMenu, ssmenu)
+            for fichier in self.listePatrons.liste[nomSsMenu]:
+               id = ssmenu.insertItem(fichier, self.handleOpenPatrons)
+               self.ficPatrons[idx]=fichier
+               self.Patrons.setItemParameter(id,idx)
+               idx=idx+1
+
+    def handleShowRecentMenu(self):
+        """
+        Private method to set up recent files menu.
+        """
+        idx = 0
+        self.recentMenu.clear()
+        
+        for rp in self.viewmanager.recent:
+            id = self.recentMenu.insertItem('&%d. %s' % (idx+1, unicode(rp)),
+                                            self.handleOpenRecent)
+            self.recentMenu.setItemParameter(id,idx)
+            
+            idx = idx + 1
+            
+        self.recentMenu.insertSeparator()
+        self.recentMenu.insertItem(self.trUtf8('&Clear'), self.handleClearRecent)
+        
+    def handleOpenPatrons(self, idx):
+        fichier=REPINI+"/../Editeur/Patrons/"+self.ficPatrons[idx]
+        self.viewmanager.handleOpen(fn=fichier, patron = 1)
+
+
+    def handleOpenRecent(self, idx):
+        """
+        Private method to open a file from the list of rencently opened files.
+        
+        @param idx index of the selected entry (int)
+        """        
+        self.viewmanager.handleOpen(unicode(self.viewmanager.recent[idx]))
+        
+    def handleClearRecent(self):
+        """
+        Private method to clear the recent files menu.
+        """
+##        self.recent = QStringList()
+        self.viewmanager.recent = QStringList()
+
+        
+    def handleLastEditorClosed(self):
+        """
+        Public slot to handle the lastEditorClosed signal.
+        """
+        print 10*"handleLastEditorClosed: CS_pbruno todo griser les parties k'il faut "
+        pass # CS_pbruno todo griser les parties k'il faut
+        
+    def handleEditorOpened(self, fn):
+        """
+        Public slot to handle the editorOpened signal.
+        
+        @param fn filename of the opened editor (string)
+        """
+        print 10*"handleEditorOpened: CS_pbruno todo griser les parties k'il faut "
+        pass # CS_pbruno todo degriser les parties k'il faut
+        
+        
+    def fileNew(self):        
+        self.viewmanager.newEditor()        
+        
+    def fileOpen(self, prog=None):
+        self.viewmanager.handleOpen(prog)        
+        
+    def fileNewView(self):
+        self.viewmanager.handleNewView()
+        
+    def fileSave(self):
+        self.viewmanager.saveCurrentEditor()
+        
+    def fileSaveAs(self):
+        self.viewmanager.saveAsCurrentEditor()
+        
+    def fileClose(self):
+        self.viewmanager.handleClose()
+        
+    def fileCloseAll(self):
+        self.viewmanager.handleCloseAll()
+        
+    def fileExit(self):
+        self.viewmanager.handleCloseAll()
+        qApp.closeAllWindows()
+        
+    def editCopy(self):
+        self.viewmanager.handleEditCopy()
+      
+    def editCut(self):
+        self.viewmanager.handleEditCut()
+    
+    def editPaste(self):
+        self.viewmanager.handleEditPaste()
+        
+    def jdcFichierSource(self):
+        self.viewmanager.handleViewJdcFichierSource()
+        
+    def jdcRapport(self):
+        self.viewmanager.handleViewJdcRapport()
+        
+
+  
+        
+    
+if __name__=='__main__':
+
+    # Modules Eficas
+    from Aster 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
+
+    #CS_pbruno note: fait implicitement des trucs ces imports (grr)
+    #import styles
+    from Editeur import import_code
+    from Editeur import session
+
+    # Analyse des arguments de la ligne de commande
+    options=session.parse(sys.argv)
+    code=options.code
+
+    app = QApplication(sys.argv)    
+    mw = Appli()
+    app.setMainWidget(mw)
+    app.connect(app, SIGNAL("lastWindowClosed()"), app, SLOT("quit()"))
+    mw.show()
+            
+    res = app.exec_loop()
+    sys.exit(res)
diff --git a/InterfaceQT/qtSaisie.py b/InterfaceQT/qtSaisie.py
new file mode 100644 (file)
index 0000000..3ec98d3
--- /dev/null
@@ -0,0 +1,144 @@
+# -*- 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 *
+
+# Import des panels
+
+class SaisieValeur:
+  """
+  Classe contenant les méthodes communes aux  panels
+  permettant de choisir des valeurs 
+  """
+  def __init__(self):
+        pass
+
+  def InitListBoxASSD(self):
+       listeNomsSD = self.node.item.get_sd_avant_du_bon_type()
+       for aSD in listeNomsSD:
+            self.listBoxASSD.insertItem( aSD)
+            QObject.connect(self.listBoxASSD, SIGNAL("doubleClicked(QListBoxItem*)" ), self.ClicASSD )
+       min,max =  self.node.item.GetMinMax()
+       if (min == 1 and min == max and len(listeNomsSD)==1 ):
+            if ('R' not in self.node.item.get_type()) :
+               self.listBoxASSD.setCurrentItem(0)
+               self.ClicASSD()
+
+  def BuildLBValeurs(self):
+        self.LBValeurs.clear()
+        listeValeurs=self.node.item.GetListeValeurs()
+        for valeur in listeValeurs:
+            self.LBValeurs.insertItem(str(valeur))
+        if listeValeurs != None and listeValeurs != [] :
+            self.LBValeurs.setCurrentItem(len(listeValeurs) - 1)
+       
+
+  def RemplitPanel(self,listeDejaLa=[]):
+        self.listBoxVal.clear()
+        lChoix=self.node.item.get_liste_possible(listeDejaLa)
+        for valeur in lChoix :
+            self.listBoxVal.insertItem( valeur ) 
+
+  def ClicASSD(self):
+         valeurQstring=self.listBoxASSD.selectedItem().text()
+         commentaire = QString("Valeur selectionnée : ") 
+         commentaire.append(valeurQstring)
+         self.Commentaire.setText(commentaire)
+         valeur=valeurQstring.latin1()
+         validite,commentaire=self.politique.RecordValeur(valeur)
+         self.Commentaire.setText(QString(commentaire))
+
+  def ClicValeur(self):
+         valeurQstring=self.listBoxVal.selectedItem().text()
+         valeur=valeurQstring.latin1()
+         validite,commentaire=self.politique.RecordValeur(valeur)
+         self.Commentaire.setText(QString(commentaire))
+
+  def BOkPressed(self):
+         if self.listBoxVal.selectedItem()==None :
+            commentaire = "Pas de valeur selectionnée" 
+            self.Commentaire.setText(QString(commentaire))
+         else :
+            self.ClicValeur()       
+
+  def BOk2Pressed(self):
+         if str(self.lineEditVal.text())== "" :
+            commentaire = "Pas de valeur entrée " 
+            self.Commentaire.setText(QString(commentaire))
+         else :
+            self.LEValeurPressed()       
+
+  def LEValeurPressed(self):
+         nouvelleValeur=str(self.lineEditVal.text())
+         validite,commentaire=self.politique.RecordValeur(nouvelleValeur)
+         if commentaire != "" :
+            self.Commentaire.setText(QString(commentaire))
+
+  def BParametresPressed(self):
+         print "a faire"
+
+
+  def TraiteLEValeur(self,valeurTraitee=None) :
+        # lit la chaine entree dans le line edit
+        # et la tranforme en chaine de valeurs
+        # a traiter. renvoie eventuellement des complexes
+        listeValeurs=[]
+        if valeurTraitee == None :
+           valeurBrute=str(self.LEValeur.text())
+        else :
+           valeurBrute=valeurTraitee
+        print type(valeurBrute)
+        if valeurBrute == str("") : return 1, listeValeurs
+        try :
+           valeur=eval(valeurBrute,{})        
+        except :
+           valeur=valeurBrute
+        if type(valeur)  in (types.ListType,types.TupleType) :
+           indice = 0
+           while (indice < len(valeur)):
+              v=valeur[indice]
+              if self.node.item.wait_complex() :
+                 if (v== 'RI' or v == 'MP'):
+                    try :
+                       t=tuple([v,valeur[indice+1],valeur[indice+2]])
+                       listeValeurs.append(t)
+                       indice=indice+3
+                    except :
+                       commentaire = "Veuillez entrer le complexe sous forme aster ou sous forme python"
+                       self.editor.affiche_infos(commentaire)
+                       return listeValeurs,0
+                       
+
+                 else :     # ce n'est pas un tuple à la mode aster
+                    
+                    listeValeurs.append(v)
+                    indice = indice + 1
+
+              else:  # on n'attend pas un complexe
+                 listeValeurs.append(v)
+                 indice=indice+1
+        elif type(valeur) == types.StringType:
+             listeValeurs=valeur.split(',')
+        else:
+          listeValeurs.append(valeur)
+
+        return listeValeurs,1
diff --git a/InterfaceQT/readercata.py b/InterfaceQT/readercata.py
new file mode 100644 (file)
index 0000000..2fbe686
--- /dev/null
@@ -0,0 +1,405 @@
+# -*- 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 sert a lire un catalogue et a construire
+    un objet CataItem pour Eficas.
+    Il s'appuie sur la classe READERCATA
+"""
+# Modules Python
+import time
+import os,sys,py_compile
+import traceback
+import cPickle
+import re
+
+# Modules Eficas
+from Aster      import prefs
+from Noyau.N_CR import CR
+from utils      import init_rep_cata_dev
+
+from Editeur    import analyse_catalogue
+from Editeur    import autre_analyse_cata
+from Editeur    import uiinfo
+from monChoixCata import MonChoixCata
+
+from qt import *
+
+class READERCATA:
+
+   #menu_defs=[
+   #           ('Catalogue',[
+   #                        ("Rapport de validation catalogue",'visuCRCATA'),
+   #                      ]
+   #           )
+   #          ]
+   #
+   #button_defs=[]
+
+   def __init__(self,appli,parent):
+      self.appli=appli      
+      self.parent=parent
+      self.code=self.appli.code
+      self.appli.format_fichier.set('python')
+      self.version_code=self.appli.version_code
+      self.version_cata=None
+      self.fic_cata=None
+      self.OpenCata()
+      self.cataitem=None
+
+   def OpenCata(self):
+      """ 
+          Ouvre le catalogue standard du code courant, cad le catalogue présent
+          dans le répertoire Cata 
+      """
+      message1 = "Compilation des fichiers Eficas \n\n Veuillez patienter ..."
+      self.configure_barre(4)
+
+      liste_cata_possibles=[]
+      for catalogue in self.appli.CONFIGURATION.catalogues:
+          if catalogue[0] == self.code :
+             liste_cata_possibles.append(catalogue)
+
+      if len(liste_cata_possibles)==0:          
+          QMessageBox.critical( self.parent, "Import du catalogue","Pas de catalogue defini pour le code %s" % self.code)
+          self.appli.quit()
+          sys.exit(1)
+
+      if self.version_code is not None:
+          # La version a ete fixee
+          for cata in liste_cata_possibles:
+             if self.version_code == cata[1]:
+                self.fic_cata = cata[2]
+                self.appli.format_fichier.set(cata[3])
+      elif len(liste_cata_possibles)==1:
+          self.fic_cata = liste_cata_possibles[0][2]
+          self.code = self.appli.CONFIGURATION.catalogues[0][0]
+          self.version_code = liste_cata_possibles[0][1]
+          self.appli.format_fichier.set(liste_cata_possibles[0][3]) 
+          lab=QString("Eficas V1.12 pour ASTER avec le catalogue ")
+          lab+=self.version_code
+          qApp.mainWidget().setCaption(lab)
+      else:
+          # plusieurs catalogues sont disponibles : il faut demander a l'utilisateur
+          # lequel il veut utiliser ...
+          self.ask_choix_catalogue()
+
+      if self.fic_cata == None :
+          print "Pas de catalogue pour code %s, version %s" %(self.code,self.version_code)
+          sys.exit(0)
+
+      # Determinination du repertoire materiau
+      v_codeSansPoint=self.version_code
+      v_codeSansPoint=re.sub("\.","",v_codeSansPoint)
+      chaine="rep_mat_"+v_codeSansPoint
+      if hasattr(self.appli.CONFIGURATION,chaine):
+          a=getattr(self.appli.CONFIGURATION,chaine)
+      else :
+          try :
+             a=self.appli.CONFIGURATION.dRepMat[self.version_code]
+          except :
+             print "Probleme avec le repertoire materiau"
+             a='.'
+      self.appli.CONFIGURATION.rep_mat=a
+
+
+      # détermination de fic_cata_c et fic_cata_p
+      self.fic_cata_c = self.fic_cata + 'c'
+      self.fic_cata_p = os.path.splitext(self.fic_cata)[0]+'_pickled.py'
+
+      # import du catalogue
+      self.cata = self.import_cata(self.fic_cata)
+      self.update_barre()
+      if not self.cata :          
+          QMessageBox.critical( self.parent, "Import du catalogue","Impossible d'importer le catalogue %s" %self.fic_cata)
+          self.appli.quit()
+          sys.exit(1)
+      #
+      # analyse du catalogue (ordre des mots-clés)
+      #
+      # Retrouve_Ordre_Cata_Standard fait une analyse textuelle du catalogue
+      # remplacé par Retrouve_Ordre_Cata_Standard_autre qui utilise une numerotation
+      # des mots clés a la création
+      self.Retrouve_Ordre_Cata_Standard_autre()
+      self.update_barre()
+
+      #
+      # analyse des données liées a  l'IHM : UIinfo
+      #
+      uiinfo.traite_UIinfo(self.cata)
+      self.update_barre()
+
+      #
+      # traitement des clefs documentaires
+      #
+      self.traite_clefs_documentaires()
+
+      # chargement et analyse des catalogues développeur (le cas échéant)
+      #
+      if self.appli.CONFIGURATION.isdeveloppeur == 'OUI' :
+          init_rep_cata_dev(self.fic_cata,self.appli.CONFIGURATION.path_cata_dev)
+          fic_cata_dev = os.path.join(self.appli.CONFIGURATION.path_cata_dev,'cata_developpeur.py')
+          if os.path.isfile(fic_cata_dev):
+              # il y a bien un catalogue développeur : il faut récupérer le module_object associé ...
+              test = self.compile_cata(fic_cata_dev,fic_cata_dev+'c')
+              if not test :
+                  showinfo("Compilation catalogue développeur",
+                           "Erreur dans la compilation du catalogue développeur")
+                  self.cata = (self.cata,)
+              else:
+                  self.cata_dev =self.import_cata(fic_cata_dev)
+                  #self.Retrouve_Ordre_Cata_Developpeur()
+                  self.Retrouve_Ordre_Cata_Developpeur_autre()
+                  self.cata = (self.cata,self.cata_dev)
+          else:
+              self.cata = (self.cata,)
+      else:
+          self.cata = (self.cata,)
+      titreSuite=" avec le catalogue " + os.path.basename(self.fic_cata)
+      titre=self.appli.titre+titreSuite
+      if self.appli.top:
+        self.appli.top.title(titre)
+      self.appli.titre=titre
+
+   def import_cata(self,cata):
+      """ 
+          Réalise l'import du catalogue dont le chemin d'acca¨s est donné par cata
+      """
+      nom_cata = os.path.splitext(os.path.basename(cata))[0]
+      rep_cata = os.path.dirname(cata)
+      sys.path[:0] = [rep_cata]
+      try :
+          o=__import__(nom_cata)
+          return o
+      except Exception,e:
+          traceback.print_exc()
+          return 0
+
+   def Retrouve_Ordre_Cata_Standard_autre(self):
+      """ 
+          Construit une structure de données dans le catalogue qui permet
+          a  EFICAS de retrouver l'ordre des mots-clés dans le texte du catalogue.
+          Pour chaque entité du catlogue on crée une liste de nom ordre_mc qui
+          contient le nom des mots clés dans le bon ordre
+      """ 
+      self.cata_ordonne_dico,self.appli.liste_simp_reel=autre_analyse_cata.analyse_catalogue(self.cata)
+
+   def Retrouve_Ordre_Cata_Standard(self):
+      """ 
+          Retrouve l'ordre des mots-clés dans le catalogue, cad :
+           - si ce dernier a été modifié, relance l'analyse du catalogue pour déterminer
+               l'ordre des mots-clés dans le catalogue
+           - s'il n'a pas été modifié, relie le fichier pickle 
+      """
+      time1 = os.path.getmtime(self.fic_cata)
+      try :
+          time2 = os.path.getmtime(self.fic_cata_p)
+      except:
+          time2 = 0
+      if time2 > time1 :
+          # l'objet catalogue n'a pas été modifié depuis le dernier "pickle"
+          self.Get_Ordre_Cata()
+      else :
+          # le catalogue a été modifié depuis le dernier "pickle" :
+          # il faut retrouver l'ordre du catalogue et refaire pickle
+          self.Get_Ordre_Cata(mode='cata')
+      self.appli.affiche_infos("Catalogue standard chargé")
+
+   def Retrouve_Ordre_Cata_Developpeur(self):
+      """ 
+          Retrouve l'ordre des mots-clés dans le catalogue, cad :
+          - si ce dernier a été modifié, relance l'analyse du catalogue pour déterminer
+            l'ordre des mots-clés dans le catalogue
+          - s'il n'a pas été modifié, relie le fichier pickle 
+      """
+      if self.code != 'ASTER' : return
+      fic_cata = os.path.join(self.appli.CONFIGURATION.path_cata_dev,'cata_developpeur.py')
+      message="Chargement catalogue développeur présent dans :\n %s..." % self.appli.CONFIGURATION.path_cata_dev
+      cata_dev_ordonne = analyse_cata.analyse_catalogue(self,self.fic_cata)
+      self.cata_dev_ordonne_cr = cata_dev_ordonne.cr
+      cata_dev_ordonne_dico = cata_dev_ordonne.entites
+      self.cata_ordonne_dico.update(cata_dev_ordonne_dico)
+      self.appli.affiche_infos(" catalogue(s) développeur(s) chargé(s)" )
+
+   def Retrouve_Ordre_Cata_Developpeur_autre(self):
+      """
+          Retrouve l'ordre des mots-clés dans le catalogue, cad :
+          - si ce dernier a été modifié, relance l'analyse du catalogue pour déterminer
+            l'ordre des mots-clés dans le catalogue
+          - s'il n'a pas été modifié, relie le fichier pickle
+      """
+      if self.code != 'ASTER' : return
+      message="Chargement catalogue développeur présent dans :\n %s..." % self.appli.CONFIGURATION.path_cata_dev
+      cata_dev_ordonne_dico,self.appli.liste_simp_reel=autre_analyse_cata.analyse_catalogue(self.cata)
+      self.cata_ordonne_dico.update(cata_dev_ordonne_dico)
+      self.appli.affiche_infos(" catalogue(s) développeur(s) chargé(s)" )
+
+   def Get_Ordre_Cata(self,mode='pickle'):
+      """ 
+          Retrouve l'ordre du catalogue :
+            - mode='pickle ': tente de relire le fichier pickle et sinon lance l'analyse du catalogue
+            - mode='cata'   : force l'analyse du catalogue directement sans relire le pickle
+      """
+      if mode == 'pickle' :
+          try:
+              f = open(self.fic_cata_p)
+              u = cPickle.Unpickler(f)
+              self.cata_ordonne_dico = u.load()
+              f.close()
+          except :
+              # on peut ne pas arriver a  relire le fichier pickle s'il a été altéré
+              # ou (le plus probable) s'il a été créé sous un autre OS
+              self.Get_Ordre_Cata(mode='cata')
+      elif mode == 'cata':
+          cata_ordonne = analyse_catalogue.analyse_catalogue(self,self.fic_cata)
+          self.cata_ordonne_cr = cata_ordonne.cr
+          self.cata_ordonne_dico = cata_ordonne.entites
+          f = open(self.fic_cata_p,'w+')
+          p = cPickle.Pickler(f)
+          p.dump(self.cata_ordonne_dico)
+          f.close()
+      else :
+          raise Exception("Appel a  un mode inconnu de Get_Ordre_Cata : %s" % mode)
+          return
+
+   def ask_choix_catalogue(self):
+      """
+      Ouvre une fenetre de sélection du catalogue dans le cas oa¹ plusieurs
+      ont été définis dans Accas/editeur.ini
+      """      
+      # construction du dictionnaire et de la liste des catalogues
+      self.dico_catalogues = {}
+      defaut = None
+      for catalogue in self.appli.CONFIGURATION.catalogues:
+          if catalogue[0] == self.code :
+              self.dico_catalogues[catalogue[1]] = catalogue
+              if len(catalogue) == 5 :
+                  if catalogue[4]=='defaut' : defaut = catalogue[1]
+      liste_choix = self.dico_catalogues.keys()
+      liste_choix.sort()
+
+      lab=QString("Eficas V1.12 pour ASTER avec le catalogue ")
+
+      # teste si plusieurs catalogues ou non
+      if len(liste_choix) == 0:          
+          QMessageBox.critical( self.parent, "", "Aucun catalogue déclaré pour %s" %self.code)
+          self.appli.quit()
+          sys.exit(1)
+      #elif len(liste_choix) == 1:
+      #    self.fic_cata = self.dico_catalogues[liste_choix[0]][2]
+      #    self.version_code = liste_choix[0]
+      lab=QString("Eficas V1.12 pour ASTER avec le catalogue ")
+      #    lab+=self.version_code
+      #    qApp.mainWidget().setCaption(lab)
+      #    return          
+          
+      # création d'une boite de dialogue modale
+      widgetChoix=MonChoixCata(liste_choix,self, self.parent, "", True )
+      ret=widgetChoix.exec_loop()
+      
+      if ret == QDialog.Accepted:
+          self.version_cata=str(self.version_cata)
+          self.fic_cata = self.dico_catalogues[self.version_cata][2]
+          self.version_code = self.version_cata
+          self.appli.format_fichier.set( self.dico_catalogues[self.version_cata][3] )
+          lab+=self.version_cata
+          qApp.mainWidget().setCaption(lab)
+
+
+
+
+   def compile_cata(self,cata,catac):
+      """ 
+           Teste si le catalogue a bien besoin d'etre recompilé et si oui, le compile et
+           affiche un message dans le splash . Retourne 1 si la compilation s'est bien déroulée,
+           0 sinon.
+      """
+      time1 = os.path.getmtime(cata)
+      try:
+          time2 = os.path.getmtime(catac)
+      except:
+          time2 = 0
+      if time1 > time2:
+          try:
+              # le catalogue doit etre recompilé avant d'etre importé
+              if self.appli.test == 0 :
+                 splash._splash.configure(text="Compilation du catalogue\nCela peut prendre plusieurs secondes ...")
+              py_compile.compile(cata)
+          except:
+              return 0
+      return 1
+
+
+#--------------------------------------------------------------------------------
+# Méthodes concernant la barre de progression lors de l'analyse du catalogue
+#--------------------------------------------------------------------------------
+
+   def configure_barre(self,nbcommandes):
+      """ Configure la barre de progression en lui passant comme parama¨tre le
+          nombre de commandes du catalogue qui lui sert a  déterminer la longueur de son incrément """
+      try:
+          if self.appli.test == 0 :
+             splash._splash.configure(barre='oui',ratio = nbcommandes)
+      except:
+          pass
+
+   def update_barre(self):
+      """ Update la position de la barre de progression : la fait progresser de son incrément """
+      try:
+          if self.appli.test == 0 :
+             splash._splash.update_barre()
+      except:
+          pass
+
+   def visuCRCATA(self):
+      """
+      Méthode permettant l'affichage du rapport de validation
+      """
+      cr = CR( debut = "Début rapport de validation du catalogue",
+               fin = "Fin rapport de validation du catalogue")
+      titre="rapport de validation du catalogue"
+      if hasattr(self,'cata_ordonne_cr') :
+          cr.add(self.cata_ordonne_cr)
+      if hasattr(self,'cata_dev_ordonne_cr') :
+          cr.add(self.cata_dev_ordonne_cr)
+      for cata in self.cata:
+          if hasattr(cata,'JdC'):
+              cr.add(cata.JdC.report())
+      texte_cr = str(cr)
+      self.visu_texte_cr = Fenetre(self.appli,titre=titre,texte=texte_cr)
+
+
+   def traite_clefs_documentaires(self):
+      try:
+        self.fic_cata_clef=os.path.splitext(self.fic_cata_c)[0]+'_clefs_docu'
+        f=open(self.fic_cata_clef)
+      except:
+        #print "Pas de fichier associé contenant des clefs documentaires"
+        return
+
+      dict_clef_docu={}
+      for l in f.readlines():
+          clef=l.split(':')[0]
+          docu=l.split(':')[1]
+          docu=docu[0:-1]
+          dict_clef_docu[clef]=docu
+      for oper in self.cata.JdC.commandes:
+           if dict_clef_docu.has_key(oper.nom):
+              oper.docu=dict_clef_docu[oper.nom]
diff --git a/InterfaceQT/typeNode.py b/InterfaceQT/typeNode.py
new file mode 100644 (file)
index 0000000..9f11146
--- /dev/null
@@ -0,0 +1,54 @@
+# -*- coding: utf-8 -*-
+from qt import *
+
+#---------------------------#
+class PopUpMenuNodePartiel :
+#---------------------------#
+    def createPopUpMenu(self):
+        #menu
+        self.menu = QPopupMenu(self.tree)
+
+        #ss-menu Comment:
+        self.commentMenu = QPopupMenu( self.menu )
+        self.menu.insertItem( qApp.translate('Browser','Comment'), self.commentMenu ) 
+        self.commentMenu.insertItem( 'after', self.addCommentAfter )
+        self.commentMenu.insertItem( 'before', self.addCommentBefore )
+
+        #ss-menu Parameters:
+        self.parametersMenu = QPopupMenu( self.menu )
+        self.parametersMenu.insertItem( 'after', self.addParametersAfter )
+        self.parametersMenu.insertItem( 'before', self.addParametersBefore )
+
+        #items du menu
+        self.menu.insertItem( qApp.translate('Browser','Delete'), self.delete )
+        self.menu.insertItem( qApp.translate('Browser','Parameters'), self.parametersMenu )
+
+    
+    def addCommentAfter(self):
+        """
+        """
+        self.addComment()
+
+    def addCommentBefore(self):
+        """
+        """
+        self.addComment(False)
+
+    def addParametersAfter(self):
+        """
+        """
+        self.addParameters()
+
+    def addParametersBefore(self):
+        """
+        """
+        self.addParameters(False)
+
+
+#-----------------------------------------#
+class PopUpMenuNode(PopUpMenuNodePartiel) :
+#-----------------------------------------#
+    def createPopUpMenu(self):
+        PopUpMenuNodePartiel.createPopUpMenu(self)
+
+        self.commentMenu.insertItem( 'it', self.commentIt )
diff --git a/InterfaceQT/utilIcons.py b/InterfaceQT/utilIcons.py
new file mode 100644 (file)
index 0000000..d52fbc5
--- /dev/null
@@ -0,0 +1,52 @@
+# -*- coding: utf-8 -*-
+
+from qt import QPixmap
+import os
+
+class PixmapCache:
+    """
+    Class implementing a pixmap cache for icons.
+    """
+    def __init__(self):
+        """
+        Constructor
+        """
+        self.pixmapCache = {}
+
+    def getPixmap(self, key):
+        """
+        Public method to retrieve a pixmap.
+        
+        @param key name of the wanted pixmap (string)
+        @return the requested pixmap (QPixmap)
+        """
+        try:
+            return self.pixmapCache[key]
+        except KeyError:
+            self.pixmapCache[key] = QPixmap.fromMimeSource(key)
+            return self.pixmapCache[key]
+            
+pixCache = PixmapCache()
+
+def getPixmap(key, cache = pixCache):
+    """
+    Module function to retrieve a pixmap.
+    
+    @param key name of the wanted pixmap (string)
+    @return the requested pixmap (QPixmap)
+    """
+    return cache.getPixmap(key)
+    
+    
+
+from qt import QMimeSourceFactory
+
+def initializeMimeSourceFactory():
+    """
+    Function to initialize the default mime source factory.
+    
+    """
+    defaultFactory = QMimeSourceFactory.defaultFactory()
+    repini=os.path.dirname(os.path.abspath(__file__))
+    defaultFactory.addFilePath(repini+"/../Editeur/icons") #CS_pbruno todo (config)
+    
diff --git a/InterfaceQT/viewManager.py b/InterfaceQT/viewManager.py
new file mode 100644 (file)
index 0000000..c06e9c2
--- /dev/null
@@ -0,0 +1,2543 @@
+# -*- 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 os
+from InterfaceQT import utilIcons 
+from qt import *
+
+
+##fonctions utilitaires
+def normabspath(path):
+    """
+    Function returning a normalized, absolute path.
+    
+    @param path file path (string)
+    @return absolute, normalized path (string)
+    """
+    return os.path.abspath(path)
+    
+    
+def samepath(f1, f2):
+    """
+    Function to compare two paths.
+    
+    @param f1 first path for the compare (string)
+    @param f2 second path for the compare (string)
+    @return flag indicating whether the two paths represent the
+        same path on disk.
+    """
+    if f1 is None or f2 is None:
+        return 0
+        
+    if normcasepath(f1) == normcasepath(f2):
+        return 1
+        
+    return 0
+
+def normcasepath(path):
+    """
+    Function returning a path, that is normalized with respect to its case and references.
+    
+    @param path file path (string)
+    @return case normalized path (string)
+    """
+    return os.path.normcase(os.path.normpath(path))    
+    
+
+
+
+class ViewManager:
+    """
+    Base class inherited by all specific viewmanager classes.
+    
+    It defines the interface to be implemented by specific
+    viewmanager classes and all common methods.
+    
+    @signal lastEditorClosed emitted after the last editor window was closed
+    @signal editorOpened(string) emitted after an editor window was opened
+    @signal editorSaved(string) emitted after an editor window was saved
+    @signal checkActions(editor) emitted when some actions should be checked
+            for their status
+    @signal cursorChanged(editor) emitted after the cursor position of the active
+            window has changed
+    @signal breakpointToggled(editor) emitted when a breakpoint is toggled.
+    @signal bookmarkToggled(editor) emitted when a bookmark is toggled.
+    """
+    def __init__(self, ui ):
+        """
+        Constructor
+        
+        @param ui reference to the main user interface
+        @param dbs reference to the debug server object
+        """
+        # initialize the instance variables
+        self.ui = ui
+        self.editors = []
+        self.currentEditor = None
+        self.untitledCount = 0
+        self.srHistory = {"search" : QStringList(), "replace" : QStringList()}
+        self.editorsCheckFocusIn = 1
+        self.recent =  QStringList()      
+                
+        
+        # initialize the central store for api information (used by
+        # autocompletion and calltips)
+        self.apis = {}
+        self.initFileFilters()
+        
+        
+    def initFileFilters(self):
+        """
+        Private method to initialize the lists of supported filename filters.
+        """
+        self.fileFiltersString = self.trUtf8(\
+            'Python Files (*.py);;'
+            'Aster Files (*.com*);;'
+            'Pyrex Files (*.pyx);;'
+            'Quixote Template Files (*.ptl);;'
+            'IDL Files (*.idl);;'
+            'C Files (*.h *.c);;'
+            'C++ Files (*.h *.hpp *.hh *.cxx *.cpp *.cc);;'
+            'C# Files (*.cs);;'
+            'HTML Files (*.html *.htm *.asp *.shtml *.css);;'
+            'PHP Files (*.php *.php3 *.php4 *.php5 *.phtml);;'
+            'XML Files (*.xml *.xsl *.xslt *.dtd);;'
+            'Java Files (*.java);;'
+            'JavaScript Files (*.js);;'
+            'SQL Files (*.sql);;'
+            'Docbook Files (*.docbook);;'
+            'Perl Files (*.pl *.pm *.ph);;'
+            'Shell Files (*.sh);;'
+            'Aster Files (*.com*);;'
+            'All Files (*)')
+
+        fileFilters = QStringList.split(';;', self.fileFiltersString)
+        
+        self.ext2Filter = {}
+        for fileFilter in fileFilters:
+            extensions = QStringList.split('*', fileFilter)
+            for extension in extensions[1:]:
+                extension = unicode(extension).strip().replace(')', '')
+                if extension:
+                    self.ext2Filter[extension] = unicode(fileFilter)
+        
+        
+        
+    #####################################################################
+    ## methods above need to be implemented by a subclass
+    #####################################################################
+    
+    def canSplit(self):
+        """
+        public method to signal if splitting of the view is available.
+        
+        @return flag indicating splitting of the view is available.
+        """
+        return 0
+        
+    def addSplit(self):
+        """
+        Public method used to split the current view.
+        """
+        pass
+        
+    def removeSplit(self):
+        """
+        Public method used to remove the current split view.
+        
+        @return Flag indicating successful deletion
+        """
+        return 0
+        
+    def setSplitOrientation(self, orientation):
+        """
+        Public method used to set the orientation of the split view.
+        
+        @param orientation orientation of the split
+                (QSplitter.Horizontal or QSplitter.Vertical)
+        """
+        pass
+        
+    def eventFilter(self, object, event):
+        """
+        Private method called to filter an event.
+        
+        @param object object, that generated the event (QObject)
+        @param event the event, that was generated by object (QEvent)
+        @return flag indicating if event was filtered out
+        """
+        return 0
+        
+    def focusInEvent(self, event):
+        """
+        Public method called when the viewmanager receives focus.
+        
+        @param event the event object (QFocusEvent)
+        """
+        self.editorActGrp.setEnabled(1)
+        
+    def focusOutEvent(self, event):
+        """
+        Public method called when the viewmanager loses focus.
+        
+        @param event the event object (QFocusEvent)
+        """
+        self.editorActGrp.setEnabled(0)
+        
+    
+    def initEditMenu(self):
+        """
+        Public method to create the Edit menu
+        
+        @return the generated menu
+        """
+        menu = QPopupMenu(self.ui)
+        menu.insertTearOffHandle()
+        self.undoAct.addTo(menu)
+        self.redoAct.addTo(menu)
+        self.revertAct.addTo(menu)
+        menu.insertSeparator()
+        self.cutAct.addTo(menu)
+        self.copyAct.addTo(menu)
+        self.pasteAct.addTo(menu)
+        self.deleteAct.addTo(menu)
+        menu.insertSeparator()
+        self.indentAct.addTo(menu)
+        self.unindentAct.addTo(menu)
+        menu.insertSeparator()
+        self.commentAct.addTo(menu)
+        self.uncommentAct.addTo(menu)
+        self.streamCommentAct.addTo(menu)
+        self.boxCommentAct.addTo(menu)
+        menu.insertSeparator()
+        self.autoCompleteAct.addTo(menu)
+        self.autoCompleteFromDocAct.addTo(menu)
+        self.autoCompleteFromAPIsAct.addTo(menu)
+        menu.insertSeparator()
+        self.searchAct.addTo(menu)
+        self.searchAgainAct.addTo(menu)
+        self.replaceAct.addTo(menu)
+        menu.insertSeparator()
+        self.searchFilesAct.addTo(menu)
+        menu.insertSeparator()
+        self.gotoAct.addTo(menu)
+        self.gotoBraceAct.addTo(menu)
+        menu.insertSeparator()
+        self.selectBraceAct.addTo(menu)
+        self.selectAllAct.addTo(menu)
+        self.deselectAllAct.addTo(menu)
+        menu.insertSeparator()
+        self.shortenEmptyAct.addTo(menu)
+        self.convertEOLAct.addTo(menu)
+        
+        return menu
+        
+    def initEditToolbar(self):
+        """
+        Public method to create the Edit toolbar
+        
+        @return the generated toolbar
+        """
+        tb = QToolBar(self.ui)
+        self.undoAct.addTo(tb)
+        self.redoAct.addTo(tb)
+        tb.addSeparator()
+        self.cutAct.addTo(tb)
+        self.copyAct.addTo(tb)
+        self.pasteAct.addTo(tb)
+        self.deleteAct.addTo(tb)
+        tb.addSeparator()
+        self.indentAct.addTo(tb)
+        self.unindentAct.addTo(tb)
+        tb.addSeparator()
+        self.commentAct.addTo(tb)
+        self.uncommentAct.addTo(tb)
+        
+        return tb
+        
+    ##################################################################
+    ## Initialize the search related actions, search menu and toolbar
+    ##################################################################
+    
+    def initSearchActions(self):
+        """
+        Private method defining the user interface actions for the search commands.
+        """
+        self.searchActGrp = QActionGroup(self)
+        
+        self.searchAct = QAction(self.trUtf8('Search'),
+                QIconSet(utilIcons.getPixmap("find.png")),
+                self.trUtf8('&Search...'),
+                QKeySequence(self.trUtf8("CTRL+F","Search|Search")),
+                self.searchActGrp)
+        self.searchAct.setStatusTip(self.trUtf8('Search for a text'))
+        self.searchAct.setWhatsThis(self.trUtf8(
+            """<b>Search</b>"""
+            """<p>Search for some text in the current editor. A"""
+            """ dialog is shown to enter the searchtext and options"""
+            """ for the search.</p>"""
+        ))
+        self.connect(self.searchAct,SIGNAL('activated()'),self.handleSearch)
+        self.searchActions.append(self.searchAct)
+        
+        self.searchAgainAct = QAction(self.trUtf8('Search again'),
+                QIconSet(utilIcons.getPixmap("findNext.png")),
+                self.trUtf8('Search &again'),
+                Qt.Key_F3,self.searchActGrp)
+        self.searchAgainAct.setStatusTip(self.trUtf8('Search again for text'))
+        self.searchAgainAct.setWhatsThis(self.trUtf8(
+            """<b>Search again</b>"""
+            """<p>Search again for some text in the current editor."""
+            """ The previously entered searchtext and options are reused.</p>"""
+        ))
+        self.connect(self.searchAgainAct,SIGNAL('activated()'),self.searchDlg.handleFindNext)
+        self.searchActions.append(self.searchAgainAct)
+        
+        self.replaceAct = QAction(self.trUtf8('Replace'),
+                self.trUtf8('&Replace...'),
+                QKeySequence(self.trUtf8("CTRL+R","Search|Replace")),
+                self.searchActGrp)
+        self.replaceAct.setStatusTip(self.trUtf8('Replace some text'))
+        self.replaceAct.setWhatsThis(self.trUtf8(
+            """<b>Replace</b>"""
+            """<p>Search for some text in the current editor and replace it. A"""
+            """ dialog is shown to enter the searchtext, the replacement text"""
+            """ and options for the search and replace.</p>"""
+        ))
+        self.connect(self.replaceAct,SIGNAL('activated()'),self.handleReplace)
+        self.searchActions.append(self.replaceAct)
+        
+        self.gotoAct = QAction(self.trUtf8('Goto Line'),
+                QIconSet(utilIcons.getPixmap("goto.png")),
+                self.trUtf8('&Goto Line...'),
+                QKeySequence(self.trUtf8("CTRL+G","Search|Goto Line")),
+                self.searchActGrp)
+        self.gotoAct.setStatusTip(self.trUtf8('Goto Line'))
+        self.gotoAct.setWhatsThis(self.trUtf8(
+            """<b>Goto Line</b>"""
+            """<p>Go to a specific line of text in the current editor."""
+            """ A dialog is shown to enter the linenumber.</p>"""
+        ))
+        self.connect(self.gotoAct,SIGNAL('activated()'),self.handleGoto)
+        self.searchActions.append(self.gotoAct)
+        
+        self.gotoBraceAct = QAction(self.trUtf8('Goto Brace'),
+                QIconSet(utilIcons.getPixmap("gotoBrace.png")),
+                self.trUtf8('Goto &Brace'),
+                QKeySequence(self.trUtf8("CTRL+L","Search|Goto Brace")),
+                self.searchActGrp)
+        self.gotoBraceAct.setStatusTip(self.trUtf8('Goto Brace'))
+        self.gotoBraceAct.setWhatsThis(self.trUtf8(
+            """<b>Goto Brace</b>"""
+            """<p>Go to the matching brace in the current editor.</p>"""
+        ))
+        self.connect(self.gotoBraceAct,SIGNAL('activated()'),self.handleGotoBrace)
+        self.searchActions.append(self.gotoBraceAct)
+        
+        self.searchActGrp.setEnabled(0)
+        
+        self.searchFilesAct = QAction(self.trUtf8('Search in Files'),
+                QIconSet(utilIcons.getPixmap("projectFind.png")),
+                self.trUtf8('Search in &Files...'),
+                QKeySequence(self.trUtf8("SHIFT+CTRL+F","Search|Search Files")),
+                self)
+        self.searchFilesAct.setStatusTip(self.trUtf8('Search for a text in files'))
+        self.searchFilesAct.setWhatsThis(self.trUtf8(
+            """<b>Search in Files</b>"""
+            """<p>Search for some text in the files of a directory tree"""
+            """ or the project. A dialog is shown to enter the searchtext"""
+            """ and options for the search and to display the result.</p>"""
+        ))
+        self.connect(self.searchFilesAct,SIGNAL('activated()'),self.handleSearchFiles)
+        self.searchActions.append(self.searchFilesAct)
+        
+        
+    ##################################################################
+    ## Initialize the view related actions, view menu and toolbar
+    ##################################################################
+    
+    def initViewActions(self):
+        """
+        Protected method defining the user interface actions for the view commands.
+        """
+        self.viewActGrp = QActionGroup(self)
+        self.viewFoldActGrp = QActionGroup(self)
+
+        self.zoomInAct = QAction(self.trUtf8('Zoom in'),
+                            QIconSet(utilIcons.getPixmap("zoomIn.png")),
+                            self.trUtf8('Zoom &in'),
+                            Qt.CTRL+Qt.Key_Plus, self.viewActGrp)
+        self.zoomInAct.setStatusTip(self.trUtf8('Zoom in on the text'))
+        self.zoomInAct.setWhatsThis(self.trUtf8(
+                """<b>Zoom in</b>"""
+                """<p>Zoom in on the text. This makes the text bigger.</p>"""
+                ))
+        self.connect(self.zoomInAct,SIGNAL('activated()'),self.handleZoomIn)
+        self.viewActions.append(self.zoomInAct)
+        
+        self.zoomOutAct = QAction(self.trUtf8('Zoom out'),
+                            QIconSet(utilIcons.getPixmap("zoomOut.png")),
+                            self.trUtf8('Zoom &out'),
+                            Qt.CTRL+Qt.Key_Minus, self.viewActGrp)
+        self.zoomOutAct.setStatusTip(self.trUtf8('Zoom out on the text'))
+        self.zoomOutAct.setWhatsThis(self.trUtf8(
+                """<b>Zoom out</b>"""
+                """<p>Zoom out on the text. This makes the text smaller.</p>"""
+                ))
+        self.connect(self.zoomOutAct,SIGNAL('activated()'),self.handleZoomOut)
+        self.viewActions.append(self.zoomOutAct)
+        
+        self.zoomToAct = QAction(self.trUtf8('Zoom'),
+                            QIconSet(utilIcons.getPixmap("zoomTo.png")),
+                            self.trUtf8('&Zoom'),
+                            0, self.viewActGrp)
+        self.zoomToAct.setStatusTip(self.trUtf8('Zoom the text'))
+        self.zoomToAct.setWhatsThis(self.trUtf8(
+                """<b>Zoom</b>"""
+                """<p>Zoom the text. This opens a dialog where the"""
+                """ desired size can be entered.</p>"""
+                ))
+        self.connect(self.zoomToAct,SIGNAL('activated()'),self.handleZoom)
+        self.viewActions.append(self.zoomToAct)
+        
+        self.toggleAllAct = QAction(self.trUtf8('Toggle all folds'),
+                            self.trUtf8('Toggle &all folds'),
+                            0, self.viewFoldActGrp)
+        self.toggleAllAct.setStatusTip(self.trUtf8('Toggle all folds'))
+        self.toggleAllAct.setWhatsThis(self.trUtf8(
+                """<b>Toggle all folds</b>"""
+                """<p>Toggle all folds of the current editor.</p>"""
+                ))
+        self.connect(self.toggleAllAct,SIGNAL('activated()'),self.handleToggleAll)
+        self.viewActions.append(self.toggleAllAct)
+        
+        self.toggleCurrentAct = QAction(self.trUtf8('Toggle current fold'),
+                            self.trUtf8('Toggle &current fold'),
+                            0, self.viewFoldActGrp)
+        self.toggleCurrentAct.setStatusTip(self.trUtf8('Toggle current fold'))
+        self.toggleCurrentAct.setWhatsThis(self.trUtf8(
+                """<b>Toggle current fold</b>"""
+                """<p>Toggle the folds of the current line of the current editor.</p>"""
+                ))
+        self.connect(self.toggleCurrentAct,SIGNAL('activated()'),self.handleToggleCurrent)
+        self.viewActions.append(self.toggleCurrentAct)
+        
+        self.unhighlightAct = QAction(self.trUtf8('Remove all highlights'),
+                            QIconSet(utilIcons.getPixmap("unhighlight.png")),
+                            self.trUtf8('Remove all highlights'),
+                            0, self)
+        self.unhighlightAct.setStatusTip(self.trUtf8('Remove all highlights'))
+        self.unhighlightAct.setWhatsThis(self.trUtf8(
+                """<b>Remove all highlights</b>"""
+                """<p>Remove the highlights of all editors.</p>"""
+                ))
+        self.connect(self.unhighlightAct,SIGNAL('activated()'),self.unhighlight)
+        self.viewActions.append(self.unhighlightAct)
+        
+        self.splitViewAct = QAction(self.trUtf8('Split view'),
+                            QIconSet(utilIcons.getPixmap("splitVertical.png")),
+                            self.trUtf8('&Split view'),
+                            0, self)
+        self.splitViewAct.setStatusTip(self.trUtf8('Add a split to the view'))
+        self.splitViewAct.setWhatsThis(self.trUtf8(
+                """<b>Split view</b>"""
+                """<p>Add a split to the view.</p>"""
+                ))
+        self.connect(self.splitViewAct,SIGNAL('activated()'),self.handleSplitView)
+        self.viewActions.append(self.splitViewAct)
+        
+        self.splitOrientationAct = QAction(self.trUtf8('Arrange horizontally'),
+                            self.trUtf8('Arrange &horizontally'),
+                            0, self, None, 1)
+        self.splitOrientationAct.setStatusTip(self.trUtf8('Arrange the splitted views horizontally'))
+        self.splitOrientationAct.setWhatsThis(self.trUtf8(
+                """<b>Arrange horizontally</b>"""
+                """<p>Arrange the splitted views horizontally.</p>"""
+                ))
+        self.splitOrientationAct.setOn(0)
+        self.connect(self.splitOrientationAct,SIGNAL('activated()'),self.handleSplitOrientation)
+        self.viewActions.append(self.splitOrientationAct)
+        
+        self.splitRemoveAct = QAction(self.trUtf8('Remove split'),
+                            QIconSet(utilIcons.getPixmap("remsplitVertical.png")),
+                            self.trUtf8('&Remove split'),
+                            0, self)
+        self.splitRemoveAct.setStatusTip(self.trUtf8('Remove the current split'))
+        self.splitRemoveAct.setWhatsThis(self.trUtf8(
+                """<b>Remove split</b>"""
+                """<p>Remove the current split.</p>"""
+                ))
+        self.connect(self.splitRemoveAct,SIGNAL('activated()'),self.removeSplit)
+        self.viewActions.append(self.splitRemoveAct)
+        
+        self.viewActGrp.setEnabled(0)
+        self.viewFoldActGrp.setEnabled(0)
+        self.unhighlightAct.setEnabled(0)
+        self.splitViewAct.setEnabled(0)
+        self.splitOrientationAct.setEnabled(0)
+        self.splitRemoveAct.setEnabled(0)
+        
+    def initViewMenu(self):
+        """
+        Public method to create the View menu
+        
+        @return the generated menu
+        """
+        menu = QPopupMenu(self.ui)
+        menu.insertTearOffHandle()
+        self.viewActGrp.addTo(menu)
+        menu.insertSeparator()
+        self.viewFoldActGrp.addTo(menu)
+        menu.insertSeparator()
+        self.unhighlightAct.addTo(menu)
+        if self.canSplit():
+            menu.insertSeparator()
+            self.splitViewAct.addTo(menu)
+            self.splitOrientationAct.addTo(menu)
+            self.splitRemoveAct.addTo(menu)       
+        return menu
+        
+    def initViewToolbar(self):
+        """
+        Public method to create the View toolbar
+        
+        @return the generated toolbar
+        """
+        tb = QToolBar(self.ui)
+        self.viewActGrp.addTo(tb)
+        tb.addSeparator()
+        self.unhighlightAct.addTo(tb)
+        if self.canSplit():
+            tb.addSeparator()
+            self.splitViewAct.addTo(tb)
+            self.splitRemoveAct.addTo(tb)
+        
+        return tb
+        
+    ##################################################################
+    ## Initialize the macro related actions and macro menu
+    ##################################################################
+    
+    def initMacroActions(self):
+        """
+        Private method defining the user interface actions for the macro commands.
+        """
+        self.macroActGrp = QActionGroup(self)
+
+        self.macroStartRecAct = QAction(self.trUtf8('Start Macro Recording'),
+                            self.trUtf8('S&tart Macro Recording'),
+                            0, self.macroActGrp)
+        self.macroStartRecAct.setStatusTip(self.trUtf8('Start Macro Recording'))
+        self.macroStartRecAct.setWhatsThis(self.trUtf8(
+                """<b>Start Macro Recording</b>"""
+                """<p>Start recording editor commands into a new macro.</p>"""
+                ))
+        self.connect(self.macroStartRecAct,SIGNAL('activated()'),self.handleMacroStartRecording)
+        self.macroActions.append(self.macroStartRecAct)
+        
+        self.macroStopRecAct = QAction(self.trUtf8('Stop Macro Recording'),
+                            self.trUtf8('Sto&p Macro Recording'),
+                            0, self.macroActGrp)
+        self.macroStopRecAct.setStatusTip(self.trUtf8('Stop Macro Recording'))
+        self.macroStopRecAct.setWhatsThis(self.trUtf8(
+                """<b>Stop Macro Recording</b>"""
+                """<p>Stop recording editor commands into a new macro.</p>"""
+                ))
+        self.connect(self.macroStopRecAct,SIGNAL('activated()'),self.handleMacroStopRecording)
+        self.macroActions.append(self.macroStopRecAct)
+        
+        self.macroRunAct = QAction(self.trUtf8('Run Macro'),
+                            self.trUtf8('&Run Macro'),
+                            0, self.macroActGrp)
+        self.macroRunAct.setStatusTip(self.trUtf8('Run Macro'))
+        self.macroRunAct.setWhatsThis(self.trUtf8(
+                """<b>Run Macro</b>"""
+                """<p>Run a previously recorded editor macro.</p>"""
+                ))
+        self.connect(self.macroRunAct,SIGNAL('activated()'),self.handleMacroRun)
+        self.macroActions.append(self.macroRunAct)
+        
+        self.macroDeleteAct = QAction(self.trUtf8('Delete Macro'),
+                            self.trUtf8('&Delete Macro'),
+                            0, self.macroActGrp)
+        self.macroDeleteAct.setStatusTip(self.trUtf8('Delete Macro'))
+        self.macroDeleteAct.setWhatsThis(self.trUtf8(
+                """<b>Delete Macro</b>"""
+                """<p>Delete a previously recorded editor macro.</p>"""
+                ))
+        self.connect(self.macroDeleteAct,SIGNAL('activated()'),self.handleMacroDelete)
+        self.macroActions.append(self.macroDeleteAct)
+        
+        self.macroLoadAct = QAction(self.trUtf8('Load Macro'),
+                            self.trUtf8('&Load Macro'),
+                            0, self.macroActGrp)
+        self.macroLoadAct.setStatusTip(self.trUtf8('Load Macro'))
+        self.macroLoadAct.setWhatsThis(self.trUtf8(
+                """<b>Load Macro</b>"""
+                """<p>Load an editor macro from a file.</p>"""
+                ))
+        self.connect(self.macroLoadAct,SIGNAL('activated()'),self.handleMacroLoad)
+        self.macroActions.append(self.macroLoadAct)
+        
+        self.macroSaveAct = QAction(self.trUtf8('Save Macro'),
+                            self.trUtf8('&Save Macro'),
+                            0, self.macroActGrp)
+        self.macroSaveAct.setStatusTip(self.trUtf8('Save Macro'))
+        self.macroSaveAct.setWhatsThis(self.trUtf8(
+                """<b>Save Macro</b>"""
+                """<p>Save a previously recorded editor macro to a file.</p>"""
+                ))
+        self.connect(self.macroSaveAct,SIGNAL('activated()'),self.handleMacroSave)
+        self.macroActions.append(self.macroSaveAct)
+        
+        self.macroActGrp.setEnabled(0)
+        
+    def initMacroMenu(self):
+        """
+        Public method to create the Macro menu
+        
+        @return the generated menu
+        """
+        menu = QPopupMenu(self.ui)
+        menu.insertTearOffHandle()
+        self.macroActGrp.addTo(menu)
+        return menu
+    
+
+    def checkDirty(self, editor):
+        """
+        Private method to check dirty status and open a message window.
+        
+        @param editor editor window to check
+        @return flag indicating successful reset of the dirty flag (boolean)
+        """        
+        if editor.modified:
+            print 'CHECKDIRTY AAAAAA'
+            fn = editor.getFileName()
+            if fn is None:
+                fn = self.trUtf8('Noname')
+            res = QMessageBox.warning(self.parent(), 
+                self.trUtf8("File Modified"),
+                self.trUtf8("The file <b>%1</b> has unsaved changes.")
+                    .arg(fn),
+                self.trUtf8("&Save"), self.trUtf8("&Discard changes"),
+                self.trUtf8("&Abort"), 0, 2)
+            if res == 0:
+                (ok, newName) = editor.saveFile()
+                if ok:
+                    self.setEditorName(editor, newName)
+                return ok
+            elif res == 2:
+                return 0
+        print 'CHECKDIRTY BBBBBB'
+        return 1
+        
+    def checkAllDirty(self):
+        """
+        Public method to check the dirty status of all editors.
+        
+        @return flag indicating successful reset of all dirty flags (boolean)
+        """
+        for editor in self.editors:
+            if not self.checkDirty(editor):
+                return 0
+                
+        return 1
+        
+    def closeEditor(self, editor):
+        """
+        Private method to close an editor window.
+        
+        @param editor editor window to be closed
+        @return flag indicating success (boolean)
+        """
+        print 'CLOSEEDITOR'
+        # save file if necessary
+        if not self.checkDirty(editor):
+            return 0
+            
+        # remove the window
+        self.removeView(editor)
+        self.editors.remove(editor)        
+        if not len(self.editors):
+            self.handleLastEditorClosed()
+            self.emit(PYSIGNAL('lastEditorClosed'), ()) #CS_pbruno connecter signal avec l'appli
+        return 1
+    
+    def handleClose(self):
+        """
+        Public method to close the current window.
+        
+        @return flag indicating success (boolean)
+        """
+        aw = self.activeWindow()
+        if aw is None:
+            return 0
+            
+        res = self.closeEditor(aw)
+        if res and aw == self.currentEditor:
+            self.currentEditor = None
+            
+        return res
+        
+    def handleNewView(self):
+        """
+        Public method to close the current window.
+        
+        @return flag indicating success (boolean)
+        """
+        aw = self.activeWindow()
+        if aw is None:
+            return 0
+            
+        aw.handleNewView()
+        
+            
+    def handleCloseAll(self):
+        """
+        Private method to close all editor windows via file menu.
+        """
+        savedEditors = self.editors[:]
+        for editor in savedEditors:
+            self.closeEditor(editor)
+            
+    def handleCloseWindow(self, fn):
+        """
+        Public method to close an arbitrary source editor.
+        
+        @param fn filename of editor to be closed
+        @return flag indicating success (boolean)
+        """
+        for editor in self.editors:
+            if samepath(fn, editor.getFileName()):
+                break
+        else:
+            return 1
+            
+        res = self.closeEditor(editor)
+        if res and editor == self.currentEditor:
+            self.currentEditor = None
+            
+        return res
+        
+    def handleExit(self):
+        """
+        Public method to handle the debugged program terminating.
+        """
+        if self.currentEditor is not None:
+            self.currentEditor.highlight()
+            self.currentEditor = None
+            
+        self.setSbFile()
+
+    def handlePythonFile(self,pyfn,lineno=None):
+        """
+        Public method to handle the user selecting a file for display.
+        
+        @param pyfn name of file to be opened
+        @param lineno line number to place the cursor at
+        """
+        try:
+            self.displayPythonFile(pyfn,lineno)
+        except IOError:
+            pass
+
+        
+    def displayJDC(self,jdc):
+        """
+        Public slot to display a file in an editor.
+        
+        @param fn name of file to be opened
+        @param lineno line number to place the cursor at
+        """        
+        newWin, editor = self.getEditor(None, jdc)
+        
+        if newWin:
+            self.handleModificationStatusChanged(editor.modified, editor)
+        self.checkActions(editor)
+        
+        # insert filename into list of recently opened files
+        self.addToRecentList(editor.getFileName())
+
+
+        
+    def newEditorView(self, fn, caller):
+        """
+        Public method to create a new editor displaying the given document.
+        
+        @param fn filename of this view
+        @param caller reference to the editor calling this method        
+        """
+        from editor import JDCEditor
+        print 50*'='
+        print 'newEditorView fn->',fn
+        print 'newEditorView caller.jdc->',caller.jdc
+        print 50*'+'
+        editor = JDCEditor(fn, None, self, editor=caller)
+        self.editors.append(editor)
+        self.connect(editor, PYSIGNAL('modificationStatusChanged'),
+            self.handleModificationStatusChanged)
+        self.connect(editor, PYSIGNAL('cursorChanged'), self.handleCursorChanged)
+        self.connect(editor, PYSIGNAL('editorSaved'), self.handleEditorSaved)
+        self.connect(editor, PYSIGNAL('breakpointToggled'), self.handleBreakpointToggled)
+        self.connect(editor, PYSIGNAL('bookmarkToggled'), self.handleBookmarkToggled)
+        self.connect(editor, PYSIGNAL('syntaxerrorToggled'), self.handleSyntaxErrorToggled)
+        self.connect(editor, PYSIGNAL('autoCompletionAPIsAvailable'), 
+            self.handleEditoracAPIsAvailable)
+        self.handleEditorOpened()
+        self.emit(PYSIGNAL('editorOpened'), (fn,))
+        
+        self.connect(caller, PYSIGNAL('editorRenamed'), editor.handleRenamed)
+        self.connect(editor, PYSIGNAL('editorRenamed'), caller.handleRenamed)
+        
+        self.addView(editor, fn)
+        self.handleModificationStatusChanged(editor.modified, editor)
+        self.checkActions(editor)
+        
+    def addToRecentList(self, fn):
+        """
+        Public slot to add a filename to the list of recently opened files.
+        
+        @param fn name of the file to be added
+        """
+        self.recent.remove(fn)
+        self.recent.prepend(fn)
+        if len(self.recent) > 9:
+            self.recent = self.recent[:9]
+
+    def toggleWindow(self,w):
+        """
+        Private method to toggle a workspace window.
+        
+        @param w editor window to be toggled
+        """
+        if w.isHidden():
+            w.show()
+        else:
+            w.hide()
+
+    def setFileLine(self,fn,line,error=0,syntaxError=0):
+        """
+        Public method to update the user interface when the current program or line changes.
+        
+        @param fn filename of editor to update (string)
+        @param line line number to highlight (int)
+        @param error flag indicating an error highlight (boolean)
+        @param syntaxError flag indicating a syntax error
+        """
+        self.setSbFile(fn,line)
+
+        try:
+            newWin, self.currentEditor = self.getEditor(fn)
+        except IOError:
+            return
+
+        # Change the highlighted line.
+        self.currentEditor.highlight(line,error,syntaxError)
+
+        self.currentEditor.highlightVisible()
+        self.checkActions(self.currentEditor, 0)
+            
+    def setSbFile(self,fn=None,line=None,pos=None):
+        """
+        Private method to set the file info in the status bar.
+        
+        @param fn filename to display (string)
+        @param line line number to display (int)
+        @param pos character position to display (int)
+        """
+        if fn is None:
+            fn = ''
+            writ = '   '
+        else:
+            if QFileInfo(fn).isWritable():
+                writ = ' rw'
+            else:
+                writ = ' ro'
+        
+        self.sbWritable.setText(writ)
+        self.sbFile.setText(self.trUtf8('File: %1').arg(fn,-50))
+
+        if line is None:
+            line = ''
+
+        self.sbLine.setText(self.trUtf8('Line: %1').arg(line,5))
+
+        if pos is None:
+            pos = ''
+            
+        self.sbPos.setText(self.trUtf8('Pos: %1').arg(pos, 5))
+        
+    def unhighlight(self, current=0):
+        """
+        Public method to switch off all highlights.
+        
+        @param current flag indicating only the current editor should be unhighlighted
+                (boolean)
+        """
+        if current: 
+            if self.currentEditor is not None:
+                self.currentEditor.highlight()
+        else:
+            for editor in self.editors:
+                editor.highlight()
+
+    def getOpenFilenames(self):
+        """
+        Public method returning a list of the filenames of all editors.
+        
+        @return list of all opened filenames (list of strings)
+        """
+        filenames = []
+        for editor in self.editors:
+            fn = editor.getFileName()
+            if fn is not None:
+                filenames.append(fn)
+                
+        return filenames
+                
+    def getEditor(self, fn, jdc = None):
+        """
+        Private method to return the editor displaying the given file.
+        
+        If there is no editor with the given file, a new editor window is
+        created.
+        
+        @param fn filename to look for
+        @param isPythonFile flag indicating that this is a Python file
+                even if it doesn't have the .py extension (boolean)
+        @return tuple of two values giving a flag indicating a new window creation and
+            a reference to the editor displaying this file
+        """
+        newWin = 0
+        for editor in self.editors:
+            if samepath(fn, editor.getFileName()):
+                break
+        else:
+            from editor import JDCEditor
+            editor = JDCEditor(fn, jdc, self)
+            
+            print 'GETEDITOR editor.jdc->', editor.jdc
+            if editor.jdc: # le fichier est bien un jdc            
+                self.editors.append(editor)
+                self.connect(editor, PYSIGNAL('modificationStatusChanged'),
+                    self.handleModificationStatusChanged)
+                self.connect(editor, PYSIGNAL('cursorChanged'), self.handleCursorChanged)
+                self.connect(editor, PYSIGNAL('editorSaved'), self.handleEditorSaved)
+                self.connect(editor, PYSIGNAL('breakpointToggled'), self.handleBreakpointToggled)
+                self.connect(editor, PYSIGNAL('bookmarkToggled'), self.handleBookmarkToggled)
+                self.connect(editor, PYSIGNAL('syntaxerrorToggled'), self.handleSyntaxErrorToggled)
+                self.connect(editor, PYSIGNAL('autoCompletionAPIsAvailable'), 
+                    self.handleEditoracAPIsAvailable)
+                self.handleEditorOpened()
+                self.emit(PYSIGNAL('editorOpened'), (fn,))
+                newWin = 1
+            else:
+                editor.closeIt()
+
+        if newWin:
+            print 'GETEDITOR addView'
+            self.addView(editor, fn)
+        elif editor.jdc:
+            print 'GETEDITOR showView'
+            self.showView(editor, fn)
+            
+        return (newWin, editor)
+        
+        
+    def getOpenEditor(self, fn):
+        """
+        Public method to return the editor displaying the given file.
+        
+        @param fn filename to look for
+        @return a reference to the editor displaying this file or None, if
+            no editor was found
+        """
+        for editor in self.editors:
+            if samepath(fn, editor.getFileName()):
+                return editor
+                
+        return None
+
+    def getActiveName(self):
+        """
+        Public method to retrieve the filename of the active window.
+        
+        @return filename of active window (string)
+        """
+        aw = self.activeWindow()
+        if aw:
+            return aw.getFileName()
+        else:
+            return None
+
+    def saveEditor(self, fn):
+        """
+        Public method to save a named editor file.
+        
+        @param fn filename of editor to be saved (string)
+        @return flag indicating success (boolean)
+        """
+        for editor in self.editors:
+            if samepath(fn, editor.getFileName()):
+                break
+        else:
+            return 1
+            
+        if not editor.modified:
+            return 1
+        else:
+            ok, dummy = editor.saveFile()
+            return ok
+        
+    def saveCurrentEditor(self):
+        """
+        Public slot to save the contents of the current editor.
+        """
+        aw = self.activeWindow()
+        if aw:
+            ok, newName = aw.saveFile()
+            if ok:
+                self.setEditorName(aw, newName)
+        else:
+            return
+
+    def saveAsCurrentEditor(self):
+        """
+        Public slot to save the contents of the current editor to a new file.
+        """
+        aw = self.activeWindow()
+        if aw:
+            ok, newName = aw.saveFileAs()
+            if ok:
+                self.setEditorName(aw, newName)
+        else:
+            return
+
+    def saveAllEditors(self):
+        """
+        Public slot to save the contents of all editors.
+        """
+        for editor in self.editors:
+            ok, newName = editor.saveFile()
+            if ok:
+                self.setEditorName(editor, newName)
+        
+        # restart autosave timer
+        if self.autosaveInterval > 0:
+            self.autosaveTimer.start(self.autosaveInterval * 60000, 1)
+
+    def saveCurrentEditorToProject(self):
+        """
+        Public slot to save the contents of the current editor to the current project.
+        """
+        pro = self.ui.getProject()
+        path = pro.ppath
+        aw = self.activeWindow()
+        if aw:
+            ok, newName = aw.saveFileAs(path)
+            if ok:
+                self.setEditorName(aw, newName)
+                pro.appendFile(newName)
+        else:
+            return
+        
+    def newEditor(self):
+        """
+        Public slot to generate a new empty editor.
+        """
+        from editor import JDCEditor
+        editor = JDCEditor(None,None,self)
+        
+        self.editors.append(editor)
+        self.connect(editor, PYSIGNAL('modificationStatusChanged'),
+            self.handleModificationStatusChanged)
+        self.connect(editor, PYSIGNAL('cursorChanged'), self.handleCursorChanged)
+        self.connect(editor, PYSIGNAL('editorSaved'), self.handleEditorSaved)
+        self.connect(editor, PYSIGNAL('breakpointToggled'), self.handleBreakpointToggled)
+        self.connect(editor, PYSIGNAL('bookmarkToggled'), self.handleBookmarkToggled)
+        self.connect(editor, PYSIGNAL('syntaxerrorToggled'), self.handleSyntaxErrorToggled)
+        self.connect(editor, PYSIGNAL('autoCompletionAPIsAvailable'), 
+            self.handleEditoracAPIsAvailable)
+        self.addView(editor, None)
+        self.handleEditorOpened()
+        self.checkActions(editor)
+        self.emit(PYSIGNAL('editorOpened'), (None,))
+        
+    def printCurrentEditor(self):
+        """
+        Public slot to print the contents of the current editor.
+        """
+        aw = self.activeWindow()
+        if aw:
+            aw.printFile()
+        else:
+            return
+
+    def printCurrentEditorSel(self):
+        """
+        Public slot to print the selection of the current editor.
+        """
+        aw = self.activeWindow()
+        if aw:
+            aw.printSelection()
+        else:
+            return
+
+##    def handleShowRecentMenu(self):
+##        """
+##        Private method to set up recent files menu.
+##        """
+##        idx = 0
+##        self.recentMenu.clear()
+##        
+##        for rp in self.recent:
+##            id = self.recentMenu.insertItem('&%d. %s' % (idx+1, unicode(rp)),
+##                                            self.handleOpenRecent)
+##            self.recentMenu.setItemParameter(id,idx)
+##            
+##            idx = idx + 1
+##            
+##        self.recentMenu.insertSeparator()
+##        self.recentMenu.insertItem(self.trUtf8('&Clear'), self.handleClearRecent)
+##        
+##    def handleOpenRecent(self, idx):
+##        """
+##        Private method to open a file from the list of rencently opened files.
+##        
+##        @param idx index of the selected entry (int)
+##        """
+##        self.handlePythonFile(unicode(self.recent[idx]))
+##        
+##    def handleClearRecent(self):
+##        """
+##        Private method to clear the recent files menu.
+##        """
+##        self.recent = QStringList()
+        
+        
+    def handleViewJdcFichierSource(self):
+        self.activeWindow().viewJdcSource()
+                
+    def handleViewJdcRapport(self):
+        self.activeWindow().viewJdcRapport()
+        
+    def handleNewProject(self):
+        """
+        Public slot to handle the NewProject signal.
+        """
+        self.saveToProjectAct.setEnabled(1)
+        
+    def handleProjectOpened(self):
+        """
+        Public slot to handle the projectOpened signal.
+        """
+        self.saveToProjectAct.setEnabled(1)
+        
+    def handleProjectClosed(self):
+        """
+        Public slot to handle the projectClosed signal.
+        """
+        self.saveToProjectAct.setEnabled(0)
+        
+    def handleProjectFileRenamed(self, oldfn, newfn):
+        """
+        Public slot to handle the projectFileRenamed signal.
+        
+        @param oldfn old filename of the file (string)
+        @param newfn new filename of the file (string)
+        """
+        editor = self.getOpenEditor(oldfn)
+        if editor:
+            editor.fileRenamed(newfn)
+        
+    def enableEditorsCheckFocusIn(self, enabled):
+        """
+        Public method to set a flag enabling the editors to perform focus in checks.
+        
+        @param enabled flag indicating focus in checks should be performed (boolean)
+        """
+        self.editorsCheckFocusIn = enabled
+        
+    def editorsCheckFocusInEnabled(self):
+        """
+        Public method returning the flag indicating editors should perform focus in checks.
+        
+        @return flag indicating focus in checks should be performed (boolean)
+        """
+        return self.editorsCheckFocusIn
+
+    def handleFindFileName(self):
+        """
+        Private method to handle the search for file action.
+        """
+        self.ui.findFileNameDialog.show()
+        self.ui.findFileNameDialog.raiseW()
+        self.ui.findFileNameDialog.setActiveWindow()
+        
+    ##################################################################
+    ## Below are the action methods for the edit menu
+    ##################################################################
+    
+    def handleEditUndo(self):
+        """
+        Private method to handle the undo action.
+        """
+        self.activeWindow().undo()
+        
+    def handleEditRedo(self):
+        """
+        Private method to handle the redo action.
+        """
+        self.activeWindow().redo()
+        
+    def handleEditRevert(self):
+        """
+        Private method to handle the revert action.
+        """
+        self.activeWindow().revertToUnmodified()
+        
+    def handleEditCut(self):
+        """
+        Private method to handle the cut action.
+        """
+        self.activeWindow().cut()
+        
+    def handleEditCopy(self):
+        """
+        Private method to handle the copy action.
+        """
+        self.activeWindow().copy()
+        
+    def handleEditPaste(self):
+        """
+        Private method to handle the paste action.
+        """
+        self.activeWindow().paste()
+        
+    def handleEditDelete(self):
+        """
+        Private method to handle the delete action.
+        """
+        self.activeWindow().clear()
+        
+    def handleEditIndent(self):
+        """
+        Private method to handle the indent action.
+        """
+        self.activeWindow().indentLineOrSelection()
+        
+    def handleEditUnindent(self):
+        """
+        Private method to handle the unindent action.
+        """
+        self.activeWindow().unindentLineOrSelection()
+        
+    def handleEditComment(self):
+        """
+        Private method to handle the comment action.
+        """
+        self.activeWindow().commentLineOrSelection()
+        
+    def handleEditUncomment(self):
+        """
+        Private method to handle the uncomment action.
+        """
+        self.activeWindow().uncommentLineOrSelection()
+        
+    def handleEditStreamComment(self):
+        """
+        Private method to handle the stream comment action.
+        """
+        self.activeWindow().streamCommentLineOrSelection()
+        
+    def handleEditBoxComment(self):
+        """
+        Private method to handle the box comment action.
+        """
+        self.activeWindow().boxCommentLineOrSelection()
+        
+    def handleEditSelectBrace(self):
+        """
+        Private method to handle the select to brace action.
+        """
+        self.activeWindow().selectToMatchingBrace()
+        
+    def handleEditSelectAll(self):
+        """
+        Private method to handle the select all action.
+        """
+        self.activeWindow().selectAll(1)
+        
+    def handleEditDeselectAll(self):
+        """
+        Private method to handle the select all action.
+        """
+        self.activeWindow().selectAll(0)
+        
+    def handleConvertEOL(self):
+        """
+        Private method to handle the convert line end characters action.
+        """
+        aw = self.activeWindow()
+        aw.convertEols(aw.eolMode())
+        
+    def handleShortenEmptyLines(self):
+        """
+        Private method to handle the shorten empty lines action.
+        """
+        self.activeWindow().handleShortenEmptyLines()
+        
+    def handleEditAutoComplete(self):
+        """
+        Private method to handle the autocomplete action.
+        """
+        aw = self.activeWindow()
+        aw.autoComplete()
+        
+    def handleEditAutoCompleteFromDoc(self):
+        """
+        Private method to handle the autocomplete from document action.
+        """
+        aw = self.activeWindow()
+        aw.autoCompleteFromDocument()
+        
+    def handleEditAutoCompleteFromAPIs(self):
+        """
+        Private method to handle the autocomplete from APIs action.
+        """
+        aw = self.activeWindow()
+        aw.autoCompleteFromAPIs()
+        
+    def handleEditoracAPIsAvailable(self, available):
+        """
+        Private method to handle the availability of API autocompletion signal.
+        """
+        self.autoCompleteFromAPIsAct.setEnabled(available)
+        
+    ##################################################################
+    ## Below are the action and utility methods for the search menu
+    ##################################################################
+
+    def getWord(self, text, index):
+        """
+        Private method to get the word at a position.
+        
+        @param text text to look at (string or QString)
+        @param index position to look at (int)
+        @return the word at that position
+        """
+        re = QRegExp('[^\w_]')
+        start = text.findRev(re, index) + 1
+        end = text.find(re, index)
+        if end > start:
+            word = text.mid(start, end-start)
+        else:
+            word = QString('')
+        return word
+        
+    def textForFind(self):
+        """
+        Private method to determine the selection or the current word for the next find operation.
+        
+        @return selection or current word (QString)
+        """
+        aw = self.activeWindow()
+        if aw is None:
+            return ''
+            
+        if aw.hasSelectedText():
+            text = aw.selectedText()
+            if text.contains('\r') or text.contains('\n'):
+                # the selection contains at least a newline, it is
+                # unlikely to be the expression to search for
+                return ''
+                
+            return text
+            
+        # no selected text, determine the word at the current position
+        line, index = aw.getCursorPosition()
+        return self.getWord(aw.text(line), index)
+        
+    def getSRHistory(self, key):
+        """
+        Private method to get the search or replace history list.
+        
+        @param key list to return (must be 'search' or 'replace')
+        @return the requested history list (QStringList)
+        """
+        return self.srHistory[key]
+        
+    def handleSearch(self):
+        """
+        Private method to handle the search action.
+        """
+        self.searchDlg.showFind(self.textForFind())
+        
+    def handleReplace(self):
+        """
+        Private method to handle the replace action.
+        """
+        self.replaceDlg.showReplace(self.textForFind())
+        
+    def handleGoto(self):
+        """
+        Private method to handle the goto action.
+        """
+        aw = self.activeWindow()
+        dlg = GotoDialog(self.ui, None, 1)
+        dlg.selectAll()
+        if dlg.exec_loop() == QDialog.Accepted:
+            aw.gotoLine(min(dlg.getLinenumber(), aw.lines()))
+        
+    def handleGotoBrace(self):
+        """
+        Private method to handle the goto brace action.
+        """
+        self.activeWindow().moveToMatchingBrace()
+        
+    def handleSearchFiles(self):
+        """
+        Private method to handle the search in files action.
+        """
+        self.ui.findFilesDialog.show(self.textForFind())
+        self.ui.findFilesDialog.raiseW()
+        self.ui.findFilesDialog.setActiveWindow()
+        
+    ##################################################################
+    ## Below are the action methods for the view menu
+    ##################################################################
+    
+    def handleZoomIn(self):
+        """
+        Private method to handle the zoom in action.
+        """
+        self.activeWindow().zoomIn()
+        
+    def handleZoomOut(self):
+        """
+        Private method to handle the zoom out action.
+        """
+        self.activeWindow().zoomOut()
+        
+    def handleZoom(self):
+        """
+        Private method to handle the zoom action.
+        """
+        aw = self.activeWindow()
+        dlg = ZoomDialog(aw.getZoom(), self.ui, None, 1)
+        if dlg.exec_loop() == QDialog.Accepted:
+            aw.zoomTo(dlg.getZoomSize())
+            
+    def handleToggleAll(self):
+        """
+        Private method to handle the toggle all folds action.
+        """
+        self.activeWindow().foldAll()
+        
+    def handleToggleCurrent(self):
+        """
+        Private method to handle the toggle current fold action.
+        """
+        aw = self.activeWindow()
+        line, index = aw.getCursorPosition()
+        aw.foldLine(line)
+        
+    def handleSplitView(self):
+        """
+        Private method to handle the split view action.
+        """
+        self.addSplit()
+        
+    def handleSplitOrientation(self):
+        """
+        Private method to handle the split orientation action.
+        """
+        if self.splitOrientationAct.isOn():
+            self.setSplitOrientation(QSplitter.Horizontal)
+            self.splitViewAct.setIconSet(\
+                QIconSet(utilIcons.getPixmap("splitHorizontal.png")))
+            self.splitRemoveAct.setIconSet(\
+                QIconSet(utilIcons.getPixmap("remsplitHorizontal.png")))
+        else:
+            self.setSplitOrientation(QSplitter.Vertical)
+            self.splitViewAct.setIconSet(\
+                QIconSet(utilIcons.getPixmap("splitVertical.png")))
+            self.splitRemoveAct.setIconSet(\
+                QIconSet(utilIcons.getPixmap("remsplitVertical.png")))
+    
+    ##################################################################
+    ## Below are the action methods for the macro menu
+    ##################################################################
+    
+    def handleMacroStartRecording(self):
+        """
+        Private method to handle the start macro recording action.
+        """
+        self.activeWindow().handleStartMacroRecording()
+        
+    def handleMacroStopRecording(self):
+        """
+        Private method to handle the stop macro recording action.
+        """
+        self.activeWindow().handleStopMacroRecording()
+        
+    def handleMacroRun(self):
+        """
+        Private method to handle the run macro action.
+        """
+        self.activeWindow().handleRunMacro()
+        
+    def handleMacroDelete(self):
+        """
+        Private method to handle the delete macro action.
+        """
+        self.activeWindow().handleDeleteMacro()
+        
+    def handleMacroLoad(self):
+        """
+        Private method to handle the load macro action.
+        """
+        self.activeWindow().handleLoadMacro()
+        
+    def handleMacroSave(self):
+        """
+        Private method to handle the save macro action.
+        """
+        self.activeWindow().handleSaveMacro()
+    
+    ##################################################################
+    ## Below are the action methods for the bookmarks menu
+    ##################################################################
+    
+    def handleToggleBookmark(self):
+        """
+        Private method to handle the toggle bookmark action.
+        """
+        self.activeWindow().handleToggleBookmark()
+        
+    def handleNextBookmark(self):
+        """
+        Private method to handle the next bookmark action.
+        """
+        self.activeWindow().handleNextBookmark()
+    
+    def handlePreviousBookmark(self):
+        """
+        Private method to handle the previous bookmark action.
+        """
+        self.activeWindow().handlePreviousBookmark()
+    
+    def handleClearAllBookmarks(self):
+        """
+        Private method to handle the clear all bookmarks action.
+        """
+        for editor in self.editors:
+            editor.handleClearBookmarks()
+            
+        self.bookmarkNextAct.setEnabled(0)
+        self.bookmarkPreviousAct.setEnabled(0)
+        self.bookmarkClearAct.setEnabled(0)
+    
+    def handleShowBookmarksMenu(self):
+        """
+        Private method to handle the show bookmarks menu signal.
+        """
+        self.bookmarks = {}
+        self.bookmarksMenu.clear()
+        
+        filenames = self.getOpenFilenames()
+        filenames.sort()
+        for filename in filenames:
+            editor = self.getOpenEditor(filename)
+            for bookmark in editor.getBookmarks():
+                if len(filename) > 50:
+                    dots = "..."
+                else:
+                    dots = ""
+                id = self.bookmarksMenu.insertItem(\
+                        "%s%s : %d" % (dots, filename[-50:], bookmark))
+                self.bookmarks[id] = (filename, bookmark)
+    
+    def handleBookmarkSelected(self, id):
+        """
+        Private method to handle the bookmark selected signal.
+        
+        @param id index of the selected menu entry
+                This acts as an index into the list of bookmarks
+                that was created, when the bookmarks menu was built.
+        """
+        self.displayPythonFile(self.bookmarks[id][0], self.bookmarks[id][1])
+        
+    def handleBookmarkToggled(self, editor):
+        """
+        Private slot to handle the bookmarkToggled signal.
+        
+        It checks some bookmark actions and reemits the signal.
+        
+        @param editor editor that sent the signal
+        """
+        if editor.hasBookmarks():
+            self.bookmarkNextAct.setEnabled(1)
+            self.bookmarkPreviousAct.setEnabled(1)
+            self.bookmarkClearAct.setEnabled(1)
+        else:
+            self.bookmarkNextAct.setEnabled(0)
+            self.bookmarkPreviousAct.setEnabled(0)
+            self.bookmarkClearAct.setEnabled(0)
+        self.emit(PYSIGNAL('bookmarkToggled'), (editor,))
+    
+    def handleGotoSyntaxError(self):
+        """
+        Private method to handle the goto syntax error action.
+        """
+        self.activeWindow().handleGotoSyntaxError()
+    
+    def handleClearAllSyntaxErrors(self):
+        """
+        Private method to handle the clear all syntax errors action.
+        """
+        for editor in self.editors:
+            editor.handleClearSyntaxError()
+    
+    def handleSyntaxErrorToggled(self, editor):
+        """
+        Private slot to handle the syntaxerrorToggled signal.
+        
+        It checks some syntax error actions and reemits the signal.
+        
+        @param editor editor that sent the signal
+        """
+        if editor.hasSyntaxErrors():
+            self.syntaxErrorGotoAct.setEnabled(1)
+            self.syntaxErrorClearAct.setEnabled(1)
+        else:
+            self.syntaxErrorGotoAct.setEnabled(0)
+            self.syntaxErrorClearAct.setEnabled(0)
+        self.emit(PYSIGNAL('syntaxerrorToggled'), (editor,))
+    
+    ##################################################################
+    ## Below are general utility methods
+    ##################################################################
+    
+    def handleResetUI(self):
+        """
+        Public slot to handle the resetUI signal.
+        """
+        editor = self.activeWindow()
+        if editor is None:
+            self.setSbFile()
+        else:
+            line, pos = editor.getCursorPosition()
+            self.setSbFile(editor.getFileName(), line+1, pos)
+        
+    def closeViewManager(self):
+        """
+        Public method to shutdown the viewmanager. 
+        
+        If it cannot close all editor windows, it aborts the shutdown process.
+        
+        @return flag indicating success (boolean)
+        """
+        self.handleCloseAll()
+        if len(self.editors):
+            return 0
+        else:
+            return 1
+
+    def handleLastEditorClosed(self):
+        """
+        Private slot to handle the lastEditorClosed signal.
+        """
+        self.SauveRecents() 
+        
+        
+    def handleEditorOpened(self):
+        """
+        Private slot to handle the editorOpened signal.
+        """
+        self.closeActGrp.setEnabled(1)
+        self.saveActGrp.setEnabled(1)
+        self.printAct.setEnabled(1)
+        self.printSelAct.setEnabled(1)
+        self.editActGrp.setEnabled(1)
+        self.searchActGrp.setEnabled(1)
+        self.viewActGrp.setEnabled(1)
+        self.viewFoldActGrp.setEnabled(1)
+        self.unhighlightAct.setEnabled(1)
+        self.splitViewAct.setEnabled(1)
+        self.splitOrientationAct.setEnabled(1)
+        self.macroActGrp.setEnabled(1)
+        self.bookmarkActGrp.setEnabled(1)
+        
+        # activate the autosave timer
+        if not self.autosaveTimer.isActive() and \
+           self.autosaveInterval > 0:
+            self.autosaveTimer.start(self.autosaveInterval * 60000, 1)
+        
+        
+    def checkActions(self, editor, setSb=1):
+        """
+        Private slot to check some actions for their enable/disable status and set the statusbar info.
+        
+        @param editor editor window
+        @param setSb flag indicating an update of the status bar is wanted (boolean)
+        """
+        if editor is not None:
+            self.saveAct.setEnabled(editor.modified)
+            self.revertAct.setEnabled(editor.modified)
+            
+            lex = editor.getLexer()
+            if lex is not None:
+                self.commentAct.setEnabled(lex.canBlockComment())
+                self.uncommentAct.setEnabled(lex.canBlockComment())
+                self.streamCommentAct.setEnabled(lex.canStreamComment())
+                self.boxCommentAct.setEnabled(lex.canBoxComment())
+            else:
+                self.commentAct.setEnabled(0)
+                self.uncommentAct.setEnabled(0)
+                self.streamCommentAct.setEnabled(0)
+                self.boxCommentAct.setEnabled(0)
+            
+            if editor.hasBookmarks():
+                self.bookmarkNextAct.setEnabled(1)
+                self.bookmarkPreviousAct.setEnabled(1)
+                self.bookmarkClearAct.setEnabled(1)
+            else:
+                self.bookmarkNextAct.setEnabled(0)
+                self.bookmarkPreviousAct.setEnabled(0)
+                self.bookmarkClearAct.setEnabled(0)
+            
+            if editor.hasSyntaxErrors():
+                self.syntaxErrorGotoAct.setEnabled(1)
+                self.syntaxErrorClearAct.setEnabled(1)
+            else:
+                self.syntaxErrorGotoAct.setEnabled(0)
+                self.syntaxErrorClearAct.setEnabled(0)
+            
+            if editor.canAutoCompleteFromAPIs():
+                self.autoCompleteFromAPIsAct.setEnabled(1)
+            else:
+                self.autoCompleteFromAPIsAct.setEnabled(0)
+                
+            if setSb:
+                line, pos = editor.getCursorPosition()
+                self.setSbFile(editor.getFileName(), line+1, pos)
+                
+            self.emit(PYSIGNAL('checkActions'), (editor,))
+        
+    def handlePreferencesChanged(self):
+        """
+        Public slot to handle the preferencesChanged signal.
+        
+        This method performs the following actions
+            <ul>
+            <li>reread the colours for the syntax highlighting</li>
+            <li>reloads the already created API objetcs</li>
+            <li>starts or stops the autosave timer</li>
+            <li><b>Note</b>: changes in viewmanager type are activated
+              on an application restart.</li>
+            </ul>
+        """
+        # reload api information
+        for language, api in self.apis.items():
+            if api is not None:
+                apifiles = Preferences.getEditorAPI(language)
+                if len(apifiles):
+                    api.clear()
+                    for apifile in apifiles:
+                        api.load(apifile)
+                else:
+                    self.apis[language] = None
+                    
+        # reload editor settings
+        for editor in self.editors:
+            editor.readSettings()
+            
+        # reload the autosave timer setting
+        self.autosaveInterval = Preferences.getEditor("AutosaveInterval")
+        if len(self.editors):
+            if self.autosaveTimer.isActive() and \
+               self.autosaveInterval == 0:
+                self.autosaveTimer.stop()
+            elif not self.autosaveTimer.isActive() and \
+               self.autosaveInterval > 0:
+                self.autosaveTimer.start(self.autosaveInterval * 60000, 1)
+        
+    def handleEditorSaved(self, fn):
+        """
+        Public slot to handle the editorSaved signal.
+        
+        It simply reemits the signal.
+        
+        @param fn filename of the saved editor
+        """
+        self.emit(PYSIGNAL('editorSaved'), (fn,))
+        
+    def handleCursorChanged(self, fn, line, pos):
+        """
+        Private slot to handle the cursorChanged signal. 
+        
+        It emits the signal cursorChanged with parameter editor.
+        
+        @param fn filename (string)
+        @param line line number of the cursor (int)
+        @param pos position in line of the cursor (int)
+        """
+        self.setSbFile(fn, line, pos)
+        self.emit(PYSIGNAL('cursorChanged'), (self.getOpenEditor(fn),))
+        
+    def handleBreakpointToggled(self, editor):
+        """
+        Private slot to handle the breakpointToggled signal.
+        
+        It simply reemits the signal.
+        
+        @param editor editor that sent the signal
+        """
+        self.emit(PYSIGNAL('breakpointToggled'), (editor,))
+        
+            
+    def getProject(self):
+        """
+        Public method to get a reference to the Project object.
+        
+        @return Reference to the Project object (Project.Project)
+        """
+        return self.ui.getProject()
+        
+    def getActions(self, type):
+        """
+        Public method to get a list of all actions.
+        
+        @param type string denoting the action set to get.
+                It must be one of "edit", "file", "search",
+                "view" or "window"
+        @return list of all actions (list of QAction)
+        """
+        try:
+            exec 'actionList = self.%sActions[:]' % type
+        except:
+            actionList = []
+                
+        return actionList
+        
+    def editorCommand(self, cmd):
+        """
+        Private method to send an editor command to the active window.
+        
+        @param cmd the scintilla command to be sent
+        """
+        aw = self.activeWindow()
+        if aw:
+            aw.SendScintilla(cmd)
+        
+    ##################################################################
+    ## Below are protected utility methods
+    ##################################################################
+    
+    def _getOpenStartDir(self):
+        """
+        Protected method to return the starting directory for a file open dialog. 
+        
+        The appropriate starting directory is calculated
+        using the following search order, until a match is found:<br />
+            1: Directory of currently active editor<br />
+            2: Directory of currently active Project<br />
+            3: CWD
+
+        @return String name of directory to start or None
+        """
+        # if we have an active source, return its path
+        if self.activeWindow() is not None and \
+           self.activeWindow().getFileName():
+            return os.path.dirname(self.activeWindow().getFileName())
+            
+        # ok, try if there is an active project and return its path
+        elif self.getProject().isOpen():
+            return self.getProject().ppath
+            
+        else:
+            # None will cause open dialog to start with cwd
+            return None
+
+
+    def _getOpenFileFilter(self):
+        """
+        Protected method to return the active filename filter for a file open dialog.
+        
+        The appropriate filename filter is determined by file extension of
+        the currently active editor.
+        
+        @return name of the filename filter (QString) or None
+        """
+        if self.activeWindow() is not None and \
+           self.activeWindow().getFileName():
+            ext = os.path.splitext(self.activeWindow().getFileName())[1]
+            try:
+                return QString(self.ext2Filter[ext])
+            except KeyError:
+                return None
+                
+        else:
+            return None
+
+            
+
+
+"""
+Module implementing a tabbed viewmanager class.
+"""
+
+
+
+class TabWidget(QTabWidget):
+    """
+    Class implementing a custimized TabWidget.
+    """
+    def __init__(self, parent):
+        """
+        Constructor
+        
+        @param parent parent widget (QWidget)
+        """
+        QTabWidget.__init__(self, parent)
+        
+        self.editors = []
+        self.curIndex = 0
+        
+        self.connect(self, SIGNAL("currentChanged(QWidget *)"), self.handleCurrentChanged)
+        
+    def handleCurrentChanged(self):
+        """
+        Private slot called by the currentChanged signal.
+        """
+        self.curIndex = self.currentPageIndex()
+        
+    def addTab(self, editor, title):
+        """
+        Overwritten method to add a new tab.
+        
+        @param editor the editor object to be added (QScintilla.Editor.Editor)
+        @param title title for the new tab (string, QString or QTab)
+        """
+        QTabWidget.addTab(self, editor, title)
+        
+        if not editor in self.editors:
+            self.editors.append(editor)
+            self.connect(editor, PYSIGNAL('captionChanged'),
+                self.handleCaptionChange)
+                
+    def showPage(self, editor):
+        """
+        Overridden method to show a tab.
+        
+        @param editor the editor object to be shown (QScintilla.Editor.Editor)
+        """
+        QTabWidget.showPage(self, editor)
+        self.curIndex = self.indexOf(editor)
+        
+    def nextTab(self):
+        """
+        Public slot used to show the next tab.
+        """
+        if self.count():
+            self.curIndex += 1
+            if self.curIndex == self.count():
+                self.curIndex = 0
+                
+            QTabWidget.showPage(self, self.page(self.curIndex))
+
+    def prevTab(self):
+        """
+        Public slot used to show the previous tab.
+        """
+        if self.count():
+            self.curIndex -= 1
+            if self.curIndex == -1:
+                self.curIndex = self.count() - 1
+                
+            QTabWidget.showPage(self, self.page(self.curIndex))
+
+    def handleCaptionChange(self, cap, editor):
+        """
+        Private method to handle Caption change signals from the editor. 
+        
+        Updates the listview text to reflect the new caption information.
+        
+        @param cap Caption for the editor
+        @param editor Editor to update the caption for
+        """
+        fn = editor.getFileName()
+        if fn:
+            txt = os.path.basename(fn)
+            if editor.isReadOnly():
+                txt = '%s (ro)' % txt
+            self.changeTab(editor, txt)
+        
+    def removePage(self, object):
+        """
+        Overwritten method to remove a page.
+        
+        @param object object to be removed (QObject)
+        """
+        QTabWidget.removePage(self, object)
+        
+        self.disconnect( object, PYSIGNAL('captionChanged'),
+                         self.handleCaptionChange )
+        self.editors.remove(object)
+        
+    def hasEditor(self, editor):
+        """
+        Public method to check for an editor.
+        
+        @param editor editor object to check for
+        @return flag indicating, whether the editor to be checked belongs
+            to the list of editors managed by this tab widget.
+        """
+        return editor in self.editors
+        
+    def hasEditors(self):
+        """
+        Public method to test, if any editor is managed.
+        
+        @return flag indicating editors are managed
+        """
+        return len(self.editors) and 1 or 0
+        
+class Tabview(QSplitter, ViewManager):
+    """
+    Class implementing a tabbed viewmanager class embedded in a splitter.
+    
+    @signal lastEditorClosed emitted after the last editor window was closed
+    @signal editorOpened emitted after an editor window was opened
+    @signal editorSaved emitted after an editor window was saved
+    """
+    def __init__(self,parent, ui):
+        """
+        Constructor
+        
+        @param parent parent widget (QWidget)
+        @param ui reference to the main user interface
+        @param dbs reference to the debug server object
+        """
+        self.tabWidgets = []
+        
+        QSplitter.__init__(self,parent)
+        ViewManager.__init__(self, ui)
+        tw = TabWidget(self)
+        self.tabWidgets.append(tw)
+        self.currentTabWidget = tw
+        self.connect(tw, SIGNAL('currentChanged(QWidget*)'),
+            self.handleCurrentChanged)
+        tw.installEventFilter(self)
+        tw.tabBar().installEventFilter(self)
+        self.setOrientation(QSplitter.Vertical)
+        
+    def initViewActions(self):
+        """
+        Protected method defining the user interface actions for the view commands.
+        """
+        ViewManager.initViewActions(self)
+        
+        self.nextTabAct = QAction(self.trUtf8('Show next tab'), 
+                      self.trUtf8('Show next tab'), 
+                      QKeySequence(self.trUtf8('Ctrl+Alt+Tab')), self)
+        self.connect(self.nextTabAct, SIGNAL('activated()'), self.nextTab)
+        self.viewActions.append(self.nextTabAct)
+        
+        self.prevTabAct = QAction(self.trUtf8('Show previous tab'), 
+                      self.trUtf8('Show previous tab'), 
+                      QKeySequence(self.trUtf8('Shift+Ctrl+Alt+Tab')), self)
+        self.connect(self.prevTabAct, SIGNAL('activated()'), self.prevTab)
+        self.viewActions.append(self.prevTabAct)
+        
+    def nextTab(self):
+        """
+        Private slot used to show the next tab of the current tabwidget.
+        """
+        self.currentTabWidget.nextTab()
+        
+    def prevTab(self):
+        """
+        Private slot used to show the previous tab of the current tabwidget.
+        """
+        self.currentTabWidget.prevTab()
+        
+    def canCascade(self):
+        """
+        Public method to signal if cascading of managed windows is available.
+        
+        @return flag indicating cascading of windows is available
+        """
+        return 0
+        
+    def canTile(self):
+        """
+        Public method to signal if tiling of managed windows is available.
+        
+        @return flag indicating tiling of windows is available
+        """
+        return 0
+        
+    def canSplit(self):
+        """
+        public method to signal if splitting of the view is available.
+        
+        @return flag indicating splitting of the view is available.
+        """
+        return 1
+        
+    def tile(self):
+        """
+        Public method to tile the managed windows.
+        """
+        pass
+        
+    def cascade(self):
+        """
+        Public method to cascade the managed windows.
+        """
+        pass
+        
+    def removeAllViews(self):
+        """
+        Private method to remove all views (i.e. windows)
+        """
+        for win in self.editors:
+            self.removeView(win)
+            
+    def removeView(self, win):
+        """
+        Private method to remove a view (i.e. window)
+        
+        @param win editor window to be removed
+        """
+        print 'removeView win', win
+        for tw in self.tabWidgets:
+            if tw.hasEditor(win):
+                tw.removePage(win)
+                break        
+        win.closeIt()        
+        
+        print 'removeView A'
+        # if this was the last editor in this view, switch to the next, that
+        # still has open editors
+        print 'removeView B'
+        for i in range(self.tabWidgets.index(tw), -1, -1) + \
+                 range(self.tabWidgets.index(tw) + 1, len(self.tabWidgets)):
+            print 'removeView C'
+            if self.tabWidgets[i].hasEditors():
+                self.currentTabWidget = self.tabWidgets[i]
+                self.activeWindow().setFocus()
+                print 'removeView D',self.activeWindow()
+                break
+    
+    def addView(self, win, fn=None):
+        """
+        Private method to add a view (i.e. window)
+        
+        @param win editor window to be added
+        @param fn filename of this editor
+        """
+        win.show()
+        if fn is None:
+            self.untitledCount += 1
+            self.currentTabWidget.addTab(win, self.trUtf8("Untitled %1").arg(self.untitledCount))
+        else:
+            txt = os.path.basename(fn)
+            if not QFileInfo(fn).isWritable():
+                txt = '%s (ro)' % txt
+            self.currentTabWidget.addTab(win, txt)
+            self.currentTabWidget.setTabToolTip(win, os.path.dirname(fn))
+        self.currentTabWidget.showPage(win)
+        win.setFocus()
+    
+    def showView(self, win, fn=None):
+        """
+        Private method to show a view (i.e. window)
+        
+        @param win editor window to be shown
+        @param fn filename of this editor
+        """
+        win.show()
+        for tw in self.tabWidgets:
+            if tw.hasEditor(win):
+                tw.showPage(win)
+                self.currentTabWidget = tw
+                break
+        win.setFocus()
+    
+    def activeWindow(self):
+        """
+        Private method to return the active (i.e. current) window.
+        
+        @return reference to the active editor
+        """
+        return self.currentTabWidget.currentPage()
+        
+    def handleShowWindowMenu(self, windowMenu):
+        """
+        Private method to set up the viewmanager part of the Window menu.
+        
+        @param windowMenu reference to the window menu
+        """
+        pass
+        
+    def initWindowActions(self):
+        """
+        Define the user interface actions for window handling.
+        """
+        pass
+        
+    def setEditorName(self, editor, newName):
+        """
+        Change the displayed name of the editor.
+        
+        @param editor editor window to be changed
+        @param newName new name to be shown (string or QString)
+        """
+        self.currentTabWidget.changeTab(editor, 
+            os.path.basename(unicode(newName)))
+        self.currentTabWidget.setTabToolTip(editor, 
+            os.path.dirname(unicode(newName)))
+    
+    def handleModificationStatusChanged(self, m, editor):
+        """
+        Private slot to handle the modificationStatusChanged signal.
+        
+        @param m flag indicating the modification status (boolean)
+        @param editor editor window changed
+        """
+        print 50*'handleModificationStatusChanged'
+        for tw in self.tabWidgets:
+            if tw.hasEditor(editor):
+                break
+        if m:
+            tw.setTabIconSet(editor, 
+                QIconSet(utilIcons.getPixmap("fileModified.png")))
+        elif editor.hasSyntaxErrors():
+            tw.setTabIconSet(editor, 
+                QIconSet(utilIcons.getPixmap("syntaxError.png")))
+        else:
+            tw.setTabIconSet(editor, 
+                QIconSet(utilIcons.getPixmap("empty.png")))
+        self.checkActions(editor)
+        
+    def handleSyntaxErrorToggled(self, editor):
+        """
+        Private slot to handle the syntaxerrorToggled signal.
+        
+        @param editor editor that sent the signal
+        """
+        for tw in self.tabWidgets:
+            if tw.hasEditor(editor):
+                break
+        if editor.hasSyntaxErrors():
+            tw.setTabIconSet(editor, 
+                QIconSet(utilIcons.getPixmap("syntaxError.png")))
+        else:
+            tw.setTabIconSet(editor, 
+                QIconSet(utilIcons.getPixmap("empty.png")))
+                
+        ViewManager.handleSyntaxErrorToggled(self, editor)
+        
+    def addSplit(self):
+        """
+        Public method used to split the current view.
+        """
+        tw = TabWidget(self)
+        tw.show()
+        self.tabWidgets.append(tw)
+        self.currentTabWidget = self.tabWidgets[-1]
+        self.connect(tw, SIGNAL('currentChanged(QWidget*)'),
+            self.handleCurrentChanged)
+        tw.installEventFilter(self)
+        tw.tabBar().installEventFilter(self)
+        self.setSizes([int(100/len(self.tabWidgets))] * len(self.tabWidgets))
+        self.splitRemoveAct.setEnabled(1)
+        
+    def removeSplit(self):
+        """
+        Public method used to remove the current split view.
+        
+        @return flag indicating successfull removal
+        """
+        if len(self.tabWidgets) > 1:
+            tw = self.currentTabWidget
+            res = 1
+            savedEditors = tw.editors[:]
+            for editor in savedEditors:
+                res &= self.closeEditor(editor)
+            if res:
+                i = self.tabWidgets.index(tw)
+                if i == len(self.tabWidgets)-1:
+                    i -= 1
+                self.tabWidgets.remove(tw)
+                tw.close(1)
+                self.currentTabWidget = self.tabWidgets[i]
+                if len(self.tabWidgets) == 1:
+                    self.splitRemoveAct.setEnabled(0)
+                return 1
+                
+        return 0
+        
+    def setSplitOrientation(self, orientation):
+        """
+        Public method used to set the orientation of the split view.
+        
+        @param orientation orientation of the split
+                (QSplitter.Horizontal or QSplitter.Vertical)
+        """
+        self.setOrientation(orientation)
+        
+    def handleCurrentChanged(self, editor):
+        """
+        Private slot to handle the currentChanged signal.
+        
+        @param editor selected editor window
+        """
+        self.checkActions(editor)
+        editor.setFocus()
+        
+    def eventFilter(self, watched, event):
+        """
+        Method called to filter the event queue.
+        
+        @param watched the QObject being watched
+        @param event the event that occurred
+        @return always 0
+        """
+        if event.type() == QEvent.MouseButtonPress and \
+           not event.button() == Qt.RightButton:
+            if isinstance(watched, QTabWidget):
+                self.currentTabWidget = watched
+            elif isinstance(watched, QTabBar):
+                self.currentTabWidget = watched.parent()
+            elif isinstance(watched, QScintilla.Editor.Editor):
+                for tw in self.tabWidgets:
+                    if tw.hasEditor(watched):
+                        self.currentTabWidget = tw
+                        break
+                        
+            aw = self.activeWindow()
+            if aw is not None:
+                self.checkActions(aw)
+                aw.setFocus()
+            
+        return 0
+
+
+class MyTabview(Tabview):
+    """
+    Base class inherited by all specific viewmanager classes.
+    
+    It defines the interface to be implemented by specific
+    viewmanager classes and all common methods.
+    
+    @signal lastEditorClosed emitted after the last editor window was closed
+    @signal editorOpened(string) emitted after an editor window was opened
+    @signal editorSaved(string) emitted after an editor window was saved
+    @signal checkActions(editor) emitted when some actions should be checked
+            for their status
+    @signal cursorChanged(editor) emitted after the cursor position of the active
+            window has changed
+    @signal breakpointToggled(editor) emitted when a breakpoint is toggled.
+    @signal bookmarkToggled(editor) emitted when a bookmark is toggled.
+    """
+    def __init__(self, parent, ui):
+        Tabview.__init__(self, parent, ui)
+        self.appli=parent
+        self.initRecent()
+
+    def initRecent(self) :
+       rep=self.appli.CONFIGURATION.rep_user
+       monFichier=rep+"/listefichiers"
+       index=0
+       try :
+           f=open(monFichier)
+           while ( index < 9) :
+              ligne=f.readline()
+              if ligne != "" :
+                 l=(ligne.split("\n"))[0]
+                 self.recent.append(l)
+              index=index+1
+       except : pass
+
+       try    : f.close()
+       except : pass
+        
+    def SauveRecents(self) :
+       rep=self.appli.CONFIGURATION.rep_user
+       monFichier=rep+"/listefichiers"
+       try :
+            f=open(monFichier,'w')
+            if len(self.recent) == 0 : return
+            index=0
+            while ( index <  len(self.recent)):
+              ligne=str(self.recent[index])+"\n"
+              f.write(ligne)
+              index=index+1
+       except :
+            pass
+       try :
+            f.close()
+       except :
+            pass
+
+
+    def checkActions(self, editor, setSb=1):
+        """
+        Private slot to check some actions for their enable/disable status and set the statusbar info.
+        
+        @param editor editor window
+        @param setSb flag indicating an update of the status bar is wanted (boolean)
+        """        
+        self.emit(PYSIGNAL('checkActions'), (editor,)) 
+
+    def addToRecentList(self, fn):
+        """
+        Public slot to add a filename to the list of recently opened files.
+        
+        @param fn name of the file to be added
+        """
+        self.recent.remove(fn)
+        self.recent.prepend(fn)
+        if len(self.recent) > 9:
+            self.recent = self.recent[:9] 
+        
+    def handleOpen(self,fn=None,patron=0):
+        """
+        Public slot to open a Python JDC file.
+        
+        @param prog name of file to be opened (string or QString)
+               patron booleen pour indiquer si le fichier doit etre
+                      ajoute a la liste des fichiers ouverts recemment
+        """
+        # Get the file name if one wasn't specified.
+        if fn is None:
+
+            fn = QFileDialog.getOpenFileName(self._getOpenStartDir(),
+                        self.trUtf8('JDC Files (*.comm);;''All Files (*)'), self.ui, None, None, None)
+
+            if fn.isNull():
+                return
+
+        fn = normabspath(unicode(fn))
+
+        newWin, editor = self.getEditor(fn)
+        
+        if newWin:
+            self.handleModificationStatusChanged(editor.modified, editor)
+        self.checkActions(editor)
+        
+        # insert filename into list of recently opened files
+        if patron == 0 : self.addToRecentList(fn)
+    
+
+   ##################################################################
+   ## Below are protected utility methods
+   #################################################################
+    
+    def _getOpenStartDir(self):
+        """
+        Protected method to return the starting directory for a file open dialog. 
+        
+        The appropriate starting directory is calculated
+        using the following search order, until a match is found:<br />
+            1: Directory of currently active editor<br />
+            2: Directory of currently active Project<br />
+            3: CWD
+
+        @return String name of directory to start or None
+        """
+        # if we have an active source, return its path
+        if self.activeWindow() is not None and \
+           self.activeWindow().getFileName():
+            return os.path.dirname(self.activeWindow().getFileName())
+            
+            
+        else:
+            # None will cause open dialog to start with cwd
+            return None        
+
+
+    def handleEditorOpened(self):
+        """
+        Private slot to handle the editorOpened signal.
+        """
+        pass
+        
+    def handleModificationStatusChanged(self, m, editor):
+        """
+        Private slot to handle the modificationStatusChanged signal.
+        
+        @param m flag indicating the modification status (boolean)
+        @param editor editor window changed
+        """
+        for tw in self.tabWidgets:
+            if tw.hasEditor(editor):
+                break
+        if m:
+            #tw.setTabIconSet(editor, 
+            #    QIconSet(utilIcons.getPixmap("fileModified.png")))
+            pass
+        elif editor.hasSyntaxErrors():
+            tw.setTabIconSet(editor, 
+                QIconSet(utilIcons.getPixmap("syntaxError.png")))
+        else:
+            tw.setTabIconSet(editor, 
+                QIconSet(utilIcons.getPixmap("empty.png")))
+        self.checkActions(editor)        
+        
+        
+
+
+if __name__=='__main__':
+    import sys
+    from Aster 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
+
+    #CS_pbruno note: fait implicitement des trucs ces imports (grr)
+    #import styles
+    from Editeur import import_code
+    from Editeur import session
+
+    # Analyse des arguments de la ligne de commande
+    options=session.parse(sys.argv)
+    code=options.code    
+    app = QApplication(sys.argv)
+    
+    mw = MyTabview(None,None)
+    app.setMainWidget(mw)
+    app.connect(app, SIGNAL("lastWindowClosed()"), app, SLOT("quit()"))
+    mw.show()
+    mw.getEditor('azAster.comm')
+    mw.getEditor('azAster2.comm')
+    res = app.exec_loop()
+    sys.exit(res)
diff --git a/InterfaceQT/visualisation.py b/InterfaceQT/visualisation.py
new file mode 100644 (file)
index 0000000..675bc29
--- /dev/null
@@ -0,0 +1,59 @@
+# -*- coding: utf-8 -*-
+
+# Form implementation generated from reading ui file 'visualisation.ui'
+#
+# Created: mer fév 21 10:55:14 2007
+#      by: The PyQt User Interface Compiler (pyuic) 3.13
+#
+# WARNING! All changes made in this file will be lost!
+
+
+from qt import *
+
+
+class visual(QWidget):
+    def __init__(self,parent = None,name = None,fl = 0):
+        QWidget.__init__(self,parent,name,fl)
+
+        if not name:
+            self.setName("visual")
+
+        f = QFont(self.font())
+        f.setPointSize(14)
+        self.setFont(f)
+
+
+        self.frame5 = QFrame(self,"frame5")
+        self.frame5.setGeometry(QRect(10,520,801,41))
+        self.frame5.setFrameShape(QFrame.StyledPanel)
+        self.frame5.setFrameShadow(QFrame.Raised)
+
+        self.pushBOK = QPushButton(self.frame5,"pushBOK")
+        self.pushBOK.setGeometry(QRect(120,8,121,25))
+
+        self.pushBSave = QPushButton(self.frame5,"pushBSave")
+        self.pushBSave.setGeometry(QRect(470,8,120,25))
+
+        self.textBrowser1 = QTextBrowser(self,"textBrowser1")
+        self.textBrowser1.setGeometry(QRect(10,10,810,500))
+
+        self.languageChange()
+
+        self.resize(QSize(830,582).expandedTo(self.minimumSizeHint()))
+        self.clearWState(Qt.WState_Polished)
+
+        self.connect(self.pushBOK,SIGNAL("clicked()"),self.close)
+        self.connect(self.pushBSave,SIGNAL("clicked()"),self.Save)
+
+
+    def languageChange(self):
+        self.setCaption(self.__tr("Visualisation du rapport de validation du jeu de commandes courant"))
+        self.pushBOK.setText(self.__tr("Fermer"))
+        self.pushBSave.setText(self.__tr("Sauver"))
+
+
+    def Save(self):
+        print "visual.Save(): Not implemented yet"
+
+    def __tr(self,s,c = None):
+        return qApp.translate("visual",s,c)
diff --git a/InterfaceTK/Interp.py b/InterfaceTK/Interp.py
new file mode 100644 (file)
index 0000000..8fb9582
--- /dev/null
@@ -0,0 +1,153 @@
+# -*- 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 Tkinter,ScrolledText
+import os, sys, string, traceback 
+import code
+
+sys.ps1 = ">>> "
+sys.ps2 = "... "
+
+class PythonInterpreter( code.InteractiveConsole):
+    def __init__( self, text, namespace = None):
+        code.InteractiveConsole.__init__( self, namespace)
+        self.text = text
+
+    def showtraceback( self):
+        start = self.text.pos + " - 1 lines"
+        code.InteractiveConsole.showtraceback( self)
+        end = self.text.pos
+        self.text.tag_add( "exception", start, end)
+
+class InterpWindow(Tkinter.Toplevel):
+    def __init__(self,namespace, parent=None):
+        Tkinter.Toplevel.__init__(self,parent)
+        self._initTkWidgets()
+        self.stdout = self.stderr = self
+        self.pos = '1.0'
+        self.history = [ '' ]
+        self.hpos = 0
+        self.tabCount = 0
+        self.shell = PythonInterpreter( self,namespace)
+        self.write("Python %s on %s\n%s\n(%s)\n" %
+                       (sys.version, sys.platform, sys.copyright,
+                        self.__class__.__name__))
+        self.write( sys.ps1)
+        self.text.focus_set()
+
+    def _initTkWidgets( self):
+        self.text = ScrolledText.ScrolledText( self, bg = "white",fg="black", wrap="word")
+        self.text.pack( fill='both', expand = 1)
+        self.text.bind( '<KeyPress>', self.clearMsg)
+        self.text.bind( '<Return>', self.inputhandler)
+        self.text.bind( '<KP_Enter>', self.inputhandler)
+        self.text.bind( '<Up>', self.uphistory)
+        self.text.bind( '<Down>', self.downhistory)
+        self.text.bind( '<Control-a>', self.goto_sol)
+        self.text.bind( '<Control-d>', self.sendeof)
+        self.text.tag_config("exception", foreground = "red")
+
+    def swapStdFiles(self):
+        sys.stdout,self.stdout = self.stdout,sys.stdout
+        sys.stderr,self.stderr = self.stderr,sys.stderr
+
+    def write(self, data):
+        self.text.insert("end", data)
+        self.pos = self.text.index("end - 1 char")
+        self.text.yview_pickplace("end")
+
+    def tag_add( self, tag, start, end):
+        self.text.tag_add( tag, start, end)
+
+    def inputhandler(self, *args):
+        # Remove any extraneous stuff
+        self.text.delete( self.pos + " lineend", "end")
+        # Now get the line
+        line = self.text.get(self.pos, "end - 1 char")
+        self.text.insert("end", "\n")
+        self.pos = self.text.index("end")
+        self.addHistory( line)
+        self.swapStdFiles()
+        if self.shell.push( line):
+            self.write(sys.ps2)
+        else:
+            self.write(sys.ps1)
+        self.swapStdFiles()
+        self.text.mark_set("insert", "end")
+        return "break"
+
+    def addHistory( self, line):
+        if line:
+            self.history.insert( len( self.history) - 1, line)
+            self.hpos = len( self.history) - 1
+
+    def sendeof(self, *args):
+        self.destroy()
+        return "break"
+
+    def uphistory(self, event=None):
+        if not self.history: return "break"
+
+        if self.hpos > 0:
+            self.hpos = self.hpos - 1
+
+        line = self.history[ self.hpos]
+        self.text.delete( self.pos, "end")
+        self.text.insert( self.pos, line)
+
+        return "break"
+
+    def downhistory( self, event=None):
+        if not self.history: return "break"
+
+        if self.hpos < (len( self.history) - 1):
+            self.hpos = self.hpos + 1
+
+        line = self.history[ self.hpos]
+        self.text.delete( self.pos, "end")
+        self.text.insert( self.pos, line)
+
+        return "break"
+
+    def goto_sol( self, event=None):
+        """
+        Met en mode edition la ligne courante
+        """
+        self.text.mark_set( 'insert', 'insert linestart + 4 chars')
+        return "break"
+        
+    def clearMsg( self, event=None):
+        index = self.text.index( "insert")
+        self.text.delete( "insert lineend", "end")
+        self.tabCount = 0
+
+if __name__ == "__main__":
+    app = Tkinter.Tk()
+    d={'a':1}
+
+    def go():
+      InterpWindow(d,parent=app)
+
+    Tkinter.Button(app,text="Interp",command=go).pack()
+    Tkinter.Button(app,text="Quit",command=app.destroy).pack()
+
+    app.mainloop()
+
diff --git a/InterfaceTK/Objecttreeitem.py b/InterfaceTK/Objecttreeitem.py
new file mode 100644 (file)
index 0000000..21998b5
--- /dev/null
@@ -0,0 +1,505 @@
+# -*- 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 généraux
+import types,string,os,glob,imp,sys
+from repr import Repr
+from copy import copy,deepcopy
+
+# import du chargeur de composants
+from comploader import make_objecttreeitem
+import treewidget
+from Ihm import CONNECTOR
+
+myrepr = Repr()
+myrepr.maxstring = 100
+myrepr.maxother = 100
+
+class TreeItem:
+
+    """Abstract class representing tree items.
+
+    Methods should typically be overridden, otherwise a default action
+    is used.
+
+    """
+    # itemNode est une factory qui doit retourner un objet de la classe Node
+    # ou dérivé de cette classe.
+    # Le widget arbre utilisera cet objet comme noeud associé au tree item.
+    # Par defaut, utilise la classe Node de base
+    # La signature de la factory est la suivante :
+    # itemNode(treeOrNode,item,command,rmenu)
+    # ou treeOrNode est le noeud parent, item est l'item associé
+    # command est une fonction python appelée sur sélection graphique
+    # du noeud et rmenu est une fonction python appelée sur click droit sur le noeud
+    itemNode=treewidget.Node
+
+    def __init__(self):
+        """Constructor.  Do whatever you need to do."""
+
+    def GetText(self):
+        """Return text string to display."""
+
+    def GetLabelText(self):
+        """Return label text string to display in front of text (if any)."""
+
+    expandable = None
+
+    def _IsExpandable(self):
+        """Do not override!  Called by TreeNode."""
+        if self.expandable is None:
+            self.expandable = self.IsExpandable()
+        return self.expandable
+
+    def IsExpandable(self):
+        """Return whether there are subitems."""
+        return 1
+
+    def _GetSubList(self):
+        """Do not override!  Called by TreeNode."""
+        if not self.IsExpandable():
+            return []
+        sublist = self.GetSubList()
+        if not sublist:
+            self.expandable = 0
+        return sublist
+
+    def IsEditable(self):
+        """Return whether the item's text may be edited."""
+
+    def SetText(self, text):
+        """Change the item's text (if it is editable)."""
+
+    def GetIconName(self):
+        """Return name of icon to be displayed normally."""
+
+    def GetSelectedIconName(self):
+        """Return name of icon to be displayed when selected."""
+
+    def GetSubList(self):
+        """Return list of items forming sublist."""
+
+    def OnDoubleClick(self):
+        """Called on a double-click on the item."""
+
+class Delegate:
+    def __init__(self, delegate=None):
+        self.object = delegate
+        self.__cache = {}
+
+    def setdelegate(self, delegate):
+        self.resetcache()
+        self.object = delegate
+
+    def getdelegate(self):
+        return self.object
+
+    def __getattr__(self, name):
+        attr = getattr(self.object, name) # May raise AttributeError
+        setattr(self, name, attr)
+        self.__cache[name] = attr
+        return attr
+
+    def resetcache(self):
+        for key in self.__cache.keys():
+            try:
+                delattr(self, key)
+            except AttributeError:
+                pass
+        self.__cache.clear()
+
+    def cachereport(self):
+        keys = self.__cache.keys()
+        keys.sort()
+        print keys
+
+
+class ObjectTreeItem(TreeItem,Delegate):
+    def __init__(self, appli, labeltext, object, setfunction=None):
+        self.labeltext = labeltext
+        self.appli = appli
+        # L'objet délegué est stocké dans l'attribut object
+        # L'objet associé à l'item est stocké dans l'attribut _object
+        # Il peut etre obtenu par appel à la méthode getObject
+        # Attention : le délégué peut etre différent de l'objet associé (MCLIST)
+        # Dans le cas d'une MCListe de longueur 1, l'objet associé est la MCListe
+        # et l'objet délégué est le MCFACT (object = _object.data[0])
+        Delegate.__init__(self,object)
+        # On cache l'objet initial (pour destruction eventuelle
+        # ultérieure)
+        self._object = object
+        self.setfunction = setfunction
+        self.expandable = 1
+        self.sublist=[]
+        self.init()
+
+    def init(self):
+        return
+
+    def getObject(self):
+        return self._object
+
+    def connect(self,channel,callable,args):
+        """ Connecte la fonction callable (avec arguments args) à l'item self sur le 
+            canal channel
+        """
+        CONNECTOR.Connect(self._object,channel,callable,args)
+        CONNECTOR.Connect(self.object, channel,callable,args)
+
+    def copy(self):
+        """
+        Crée un item copie de self
+        """
+        object = self._object.copy()
+        appli = copy(self.appli)
+        labeltext = copy(self.labeltext)
+        fonction = deepcopy(self.setfunction)
+        item = make_objecttreeitem(appli,labeltext,object,fonction)
+        return item
+    
+    def isactif(self):
+        if hasattr(self.object,'actif'):
+            return self.object.actif
+        else:
+            return 1
+    
+    def update(self,item):
+        """
+          Met a jour l'item courant a partir d'un autre item passe en argument
+          Ne fait rien par defaut
+        """
+        pass
+
+    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.labeltext,None,None
+
+    def get_nature(self) :
+        """ 
+            Retourne la nature de l'item et de l'objet
+        """ 
+        return self.object.nature
+
+    def get_regles(self):
+        """ retourne les règles de l'objet pointé par self """
+        return self.object.get_regles()
+    
+    def get_liste_mc_presents(self):
+        """ Retourne la liste des mots-clés fils de l'objet pointé par self """
+        return self.object.liste_mc_presents()
+    
+    def get_val(self):
+        """ Retourne le nom de la valeur de l'objet pointé par self dans le cas
+            où celle-ci est un objet (ASSD) """
+        return self.object.getval()
+    
+    def get_definition(self):
+        """ 
+           Retourne l'objet definition de l'objet pointé par self 
+        """
+        return self.object.definition
+
+    def get_liste_mc_ordonnee(self,liste,dico):
+        """ retourne la liste ordonnée (suivant le catalogue) brute des mots-clés
+            d'une entité composée dont le chemin complet est donné sous forme
+            d'une liste du type :ETAPE + MCFACT ou MCBLOC + ...
+            il faut encore réarranger cette liste (certains mots-clés déjà
+            présents ne doivent plus être proposés, règles ...)"""
+        return self.object.get_liste_mc_ordonnee(liste,dico)
+
+    def get_liste_mc_ordonnee_brute(self,liste,dico):
+        """
+        retourne la liste ordonnée (suivant le catalogue) BRUTE des mots-clés
+        d'une entité composée dont le chemin complet est donné sous forme
+        d'une liste du type :ETAPE + MCFACT ou MCBLOC + ...
+        """
+        return self.object.get_liste_mc_ordonnee_brute(liste,dico)
+   
+    def get_genealogie(self):
+        """
+        Retourne la liste des noms des ascendants (noms de MCSIMP,MCFACT,MCBLOC ou ETAPE)
+        de l'objet pointé par self
+        """
+        return self.object.get_genealogie()
+
+    def get_index_child(self,nom_fils):
+        """
+        Retourne l'index dans la liste des fils de self du nouveau fils de nom nom_fils
+        Nécessaire pour savoir à quelle position dans la liste des fils il faut ajouter
+        le nouveau mot-clé
+        """
+        return self.object.get_index_child(nom_fils)
+
+    def get_index_child_old(self,nom_fils):
+        """
+        Retourne l'index dans la liste des fils de self du nouveau fils de nom nom_fils
+        Nécessaire pour savoir à quelle position dans la liste des fils il faut ajouter
+        le nouveau mot-clé
+        """
+        liste_noms_mc_ordonnee = self.get_liste_mc_ordonnee_brute(self.get_genealogie(),self.get_jdc().cata_ordonne_dico)
+        liste_noms_mc_presents = self.object.liste_mc_presents()
+        l=[]
+        for nom in liste_noms_mc_ordonnee:
+            if nom in liste_noms_mc_presents or nom == nom_fils:
+                l.append(nom)
+        # l contient les anciens mots-clés + le nouveau dans l'ordre
+        return l.index(nom_fils)
+        
+    def append_child(self,name,pos=None):
+        """
+          Permet d'ajouter un item fils à self
+        """
+        if pos == 'first':
+            index = 0
+        elif pos == 'last':
+            index = len(self.liste_mc_presents())
+        elif type(pos) == types.IntType :
+            # la position est fixée 
+            index = pos
+        elif type(pos) == types.InstanceType:
+            # pos est un item. Il faut inserer name apres pos
+            index = self.get_index(pos) +1
+        elif type(name) == types.InstanceType:
+            index = self.get_index_child(name.nom)
+        else:
+            index = self.get_index_child(name)
+        return self.addobject(name,index)
+
+    def append_brother(self,name,pos='after'):
+        """
+        Permet d'ajouter un frère à self
+        par défaut on l'ajoute après self
+        """
+        index = self._object.parent.get_index(self.getObject())
+        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
+        return self.parent.addobject(name,index)
+
+    def get_nom_etape(self):
+        """Retourne le nom de self """
+        return self.object.get_nom_etape()
+
+    def get_copie_objet(self):
+        """ Retourne une copie de l'objet pointé par self """
+        return self.object.copy()
+    
+    def get_position(self):
+        """ Retourne la valeur de l'attribut position de l'objet pointé par self """
+        definition = self.get_definition()
+        try:
+            return getattr(definition,'position')
+        except AttributeError:
+            return 'local'
+        
+    def get_nom(self):
+        """ Retourne le nom de l'objet pointé par self """
+        return self.object.nom
+
+    def get_jdc(self):
+        """ Retourne le jdc auquel appartient l'objet pointé par self """
+        return self.object.jdc
+    
+    def get_valeur(self):
+        """ Retourne la valeur de l'objet pointé par self """
+        return self.object.valeur
+
+    def get_cr(self):
+        """ Retourne le compte-rendu CR de self """
+        return self.object.report()
+
+    def get_objet_commentarise(self):
+        """
+        Cette méthode retourne un objet commentarisé
+        représentatif de self.object
+        --> à surcharger par les différents items
+        """
+        raise Exception("MESSAGE AU DEVELOPPEUR : il faut surcharger la methode get_objet_commentarise() pour la classe "+self.__class__.__name__)
+        pass
+        
+    def isvalid(self):
+        """ Retourne 1 si l'objet pointé par self est valide, 0 sinon"""
+        return self.object.isvalid()
+
+    def iscopiable(self):
+        """
+        Retourne 1 si l'objet est copiable, 0 sinon
+        Par défaut retourne 0
+        """
+        return 0
+    
+    def get_mc_presents(self):
+        """ Retourne le dictionnaire des mots-clés présents de l'objet pointé par self """
+        return self.object.dict_mc_presents()
+
+    def verif_condition_regles(self,l_mc_presents):
+        return self.object.verif_condition_regles(l_mc_presents)
+
+    def get_fr(self):
+        """ Retourne le fr de l'objet pointé par self """
+        try:
+            return self.object.get_fr()
+        except:
+            return ""
+
+    def get_docu(self):
+        """ Retourne la clé de doc de l'objet pointé par self """
+        return self.object.get_docu()
+
+    def set_valeur(self,new_valeur):
+        """ Remplace la valeur de l'objet pointé par self par new_valeur """
+        return self.object.set_valeur(new_valeur)
+        
+    def GetText(self):
+        return myrepr.repr(self.object)
+    
+    def GetIconName(self):
+        if not self.IsExpandable():
+            return "python"
+
+    def IsEditable(self):
+        return self.setfunction is not None
+
+    def SetText(self, text):
+        try:
+            value = eval(text)
+            self.setfunction(value)
+        except:
+            pass
+# Modif de ma part CCar : je ne comprend pas a quoi ca sert
+# ca parait meme incorrect
+      #  else:
+      #      self.object = value
+
+    def IsExpandable(self):
+        return 1
+        
+    def GetSubList(self):
+        keys = dir(self.object)
+        sublist = []
+        for key in keys:
+            try:
+                value = getattr(self.object, key)
+            except AttributeError:
+                continue
+            item = make_objecttreeitem(
+                self.appli,
+                str(key) + " =",
+                value,
+                lambda value, key=key, object=self.object:
+                    setattr(object, key, value))
+            sublist.append(item)
+        return sublist
+
+    def wait_fichier_init(self):
+        """ Retourne 1 si l'object pointé par self attend un fichier d'initialisation
+        (ex: macros POURSUITE et INCLUDE de Code_Aster), 0 SINON """
+        return self.object.definition.fichier_ini
+
+    def make_objecttreeitem(self,appli,labeltext, object, setfunction=None):
+        """
+           Cette methode, globale pour les objets de type item, permet de construire et de retourner un objet
+           de type item associé à l'object passé en argument.
+        """
+        return make_objecttreeitem(appli,labeltext,object,setfunction)
+
+    #def __del__(self):
+    #    print "__del__",self
+
+class AtomicObjectTreeItem(ObjectTreeItem):
+    def IsExpandable(self):
+        return 0
+
+class SequenceTreeItem(ObjectTreeItem):
+    def IsExpandable(self):
+        return len(self._object) > 0
+
+    def __len__(self) :
+        return len(self._object)
+   
+    def keys(self):
+        return range(len(self._object))
+
+    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 ajout_possible(self):
+        return self._object.ajout_possible()
+
+    def get_index(self,child):
+        """ Retourne le numéro de child dans la liste des enfants de self """
+        return self._object.get_index(child.getObject())
+
+    def GetText(self):
+      return  "    "
+
+    def additem(self,obj,pos):
+        self._object.insert(pos,obj)
+        item = self.make_objecttreeitem(self.appli, obj.nom + ":", obj)
+        return item
+
+    def suppitem(self,item):
+        try :
+            self._object.remove(item.getObject())
+            # la liste peut être retournée vide !
+            message = "Mot-clé " + item.getObject().nom + " supprimé"
+            self.appli.affiche_infos(message)
+            return 1
+        except:
+            return 0
+
+    def GetSubList(self):
+        isublist=iter(self.sublist)
+        liste=self._object.data
+        iliste=iter(liste)
+        self.sublist=[]
+
+        while(1):
+           old_obj=obj=None
+           for item in isublist:
+              old_obj=item.getObject()
+              if old_obj in liste:break
+
+           for obj in iliste:
+              if obj is old_obj:break
+              # nouvel objet : on cree un nouvel item
+              def setfunction(value, object=obj):
+                  object=value
+              it = self.make_objecttreeitem(self.appli, obj.nom + " : ", obj, setfunction)
+              self.sublist.append(it)
+           if old_obj is None and obj is None:break
+           if old_obj is obj: self.sublist.append(item)
+        return self.sublist
diff --git a/InterfaceTK/TroisDPal.py b/InterfaceTK/TroisDPal.py
new file mode 100644 (file)
index 0000000..c0cc0d0
--- /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.
+#
+#
+# ======================================================================
+"""
+   Ce module contient la classe 3Dpilote qui va creer les ordres 
+   de pilotage de l idl PAL pour un element de structure
+"""
+import generator
+
+class TroisDPilote:
+
+   def __init__(self,node,appli,parent):
+      self.node=node
+      self.appli=appli
+      self.parent=parent
+
+   def envoievisu(self):
+      """ 
+      """
+      format="vers3DSalome"
+      if generator.plugins.has_key(format):
+         # Le generateur existe on l'utilise
+         g=generator.plugins[format]()
+         g.init_jdc(self.node.get_jdc())
+         texte=g.gener(self.node)
+      else:
+         print "Le generateur n a pas ete trouvé"
+         print "Erreur ! Erreur!"
+         return ""
+      self.appli.envoievisu(texte)
+
diff --git a/InterfaceTK/__init__.py b/InterfaceTK/__init__.py
new file mode 100644 (file)
index 0000000..28da2d3
--- /dev/null
@@ -0,0 +1,20 @@
+# -*- 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.
+#
+#
+# ======================================================================
diff --git a/InterfaceTK/appli.py b/InterfaceTK/appli.py
new file mode 100644 (file)
index 0000000..17e9b81
--- /dev/null
@@ -0,0 +1,471 @@
+# -*- 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 contient la classe APPLI qui est la classe mère de
+    l'application EFICAS. Elle prend en charge l'organisation générale
+    des composants graphiques et l'initialisation Tk
+    L'aspect applicatif doit etre pris en charge par la classe dérivée
+"""
+# Modules Python
+import os
+import string
+import sys
+import types
+import Pmw
+import Tkinter
+from widgets import showerror
+
+# Modules Eficas
+import splash
+from Aster import prefs
+import styles
+from styles import style
+from InterfaceTK import fontes
+import tooltip
+import properties
+import convert,generator
+from Editeur import comploader
+from Editeur.utils import extension_fichier,stripPath
+
+from widgets import Fenetre
+from Misc import MakeNomComplet
+from Editeur import session
+
+import listeFichiers
+
+REPTK=os.path.dirname(os.path.abspath(__file__))
+sys.path[:0]=[REPTK]
+
+VERSION="EFICAS v1.12"
+
+class APPLI: 
+  def __init__ (self,master,code=prefs.code,fichier=None,test=0,ihm="TK") :
+      self.code=code
+      self.top=master
+      self.top.protocol("WM_DELETE_WINDOW",self.exitEFICAS)
+      self.ihm=ihm
+
+      #dimensionnement de la fenetre principale
+      #aspect ratio de l'ecran
+      aspect=float(self.top.winfo_screenwidth())/float(self.top.winfo_screenheight())
+      #resolution (pixels par point). On utilise le fait qu'on a "normalement" 72 points par inch
+      resolution= self.top.winfo_screenwidth()/(self.top.winfo_screenmmwidth()/25.4*72)
+      DDY=max(20,resolution*(fontes.standard[1]+4)) #largeur d'un caractere fonte standard en pixel
+      x=int(45*DDY) #largeur d'ouverture de 45 caracteres de fonte standard 
+      y=int(25*DDY) #hauteur d'ouverture de 25 caracteres de fonte standard
+      minx=x*8/10 #largeur min (80 pour cent de largeur)
+      miny=y*8/10 #hauteur min (80 pour cent de hauteur)
+      self.top.minsize(minx,miny)
+      self.top.geometry('%dx%d' % (x,y))
+
+      self.top.title(VERSION + ' pour '+self.code)
+      self.titre=VERSION + ' pour '+self.code
+      self.top.withdraw()
+      self.initializeTk(master)
+      Pmw.initialise(master)
+
+      self.dict_reels={}
+      self.liste_simp_reel=[]
+      # L'attribut test permet d'activer les panneaux de splash et d'erreur (test=0)
+      # Si test est different de 0, les panneaux ne sont pas activés
+      self.test=test
+
+      # Lecture des parametres de configuration (fichier global editeur.ini 
+      # et utilisateur eficas.ini)
+      self.lecture_parametres()
+
+      self.format_fichier = Tkinter.StringVar()
+      self.message=''
+      # Avant la creation du bureau qui lit le catalogue
+      self.version_code=session.d_env.cata
+
+      # Creation de la menubar, toolbar, messagebar
+      self.cree_composants_graphiques()
+      # Creation des autres composants graphiques dont le bureau (parametrable par prefs.py)
+      self.load_appli_composants()                
+      self.listeFichiers=listeFichiers.listeFichiers(self)
+      from InterfaceTK import listePatronsTK
+      self.listePatrons=listePatronsTK.listePatronsTK(self)
+      self.dir=None
+
+      # Fermer le splash et deiconifier la fenetre principale si on n'est pas en test
+      if (self.test == 0):
+           splash.fini_splash()
+           #self.affiche_FAQ()
+
+      # Ouverture des fichiers de commandes donnes sur la ligne de commande
+      cwd=os.getcwd()
+      self.dir=cwd
+      for study in session.d_env.studies:
+          os.chdir(cwd)
+          d=session.get_unit(study,self)
+          self.bureau.openJDC(file=study["comm"],units=d)
+
+
+  def send_message(self,message):
+      self.message=message
+
+  def exitEFICAS(self):
+      self.quit()
+
+  def quit(self):
+      self.top.quit()
+
+  def lecture_parametres(self):
+      """
+          Active la lecture des paramètres standards et utilisateur
+      """
+      if (self.test == 0):
+         splash._splash.configure(text = "Chargement des paramètres utilisateur")
+      from Editeur import configuration
+      self.CONFIGURATION = configuration.make_config(self,prefs.REPINI)
+      self.CONFIGStyle = configuration.make_config_style(self,prefs.REPINI)
+
+  def cree_composants_graphiques(self):
+      """
+          Cree les constituants graphiques fixes de l'application :
+           - menubar
+           - toolbar
+           - statusbar
+      """
+      if (self.test == 0):
+         splash._splash.configure(text = "Chargement de l'IHM")
+         splash._splash.configure(text = "Chargement de la menubar")
+      import menubar
+      self.menubar=menubar.MENUBAR(self,self.top)
+      if (self.test == 0):
+         splash._splash.configure(text = "Chargement de la toolbar")
+      import toolbar
+      self.toolbar=toolbar.TOOLBAR(self,self.top)
+      if (self.test == 0):
+         splash._splash.configure(text = "Chargement de la statusbar")
+      import statusbar
+      self.statusbar=statusbar.STATUSBAR(self.top,styles.style.statusfont)
+
+  def load_appli_composants(self):
+      """
+          Cree les autres constituants graphiques de l'application :
+           - bureau 
+           - readercata
+           - ...
+          Cette creation est parametrable par fichier prefs.py
+      """
+      if (self.test == 0):
+         splash._splash.configure(text = "Chargement des appli_composants")
+      for mname in self.appli_composants:
+         self.load_appli_composant(mname)
+
+  def load_appli_composant(self,mname):
+      if mname=="bureau" :
+         mnameTK="InterfaceTK."+mname
+         moduleTK=__import__(mnameTK,globals(),locals())
+         module=getattr(moduleTK,mname)
+         factory=getattr(module,mname.upper())
+         appli_composant=factory(self,self.top)
+         setattr(self,mname,appli_composant)
+         self.fill_menus(appli_composant,appli_composant.menu_defs)
+         self.toolbar.creer_boutons_appli_composant(appli_composant.button_defs,appli_composant)
+         return
+         
+
+      try :
+         mnameTK="InterfaceTK."+mname
+         moduleTK=__import__(mnameTK,globals(),locals())
+         module=getattr(moduleTK,mname) 
+      except :
+         mnameEditeur="Editeur."+mname
+         moduleEditeur=__import__(mnameEditeur,globals(),locals())
+         module=getattr(moduleEditeur,mname) 
+      factory=getattr(module,mname.upper())
+      appli_composant=factory(self,self.top)
+      setattr(self,mname,appli_composant)
+      self.fill_menus(appli_composant,appli_composant.menu_defs)
+      self.toolbar.creer_boutons_appli_composant(appli_composant.button_defs,appli_composant)
+
+  def affiche_FAQ(self):
+      import faq
+      faq.affiche(self.top)
+
+  def affiche_infos(self,message):
+      self.statusbar.affiche_infos(message)
+      return
+
+  def  initializeTk(self, root):
+        """
+        Initialize platform specific options
+        """
+        if sys.platform == 'mac':
+            self.initializeTk_mac(root)
+        elif sys.platform == 'win32':
+            self.initializeTk_win32(root)
+        else:
+            self.initializeTk_unix(root)
+
+  def initializeTk_win32(self, root):
+        root.option_add('*Font', fontes.standard)
+        root.option_add('*EntryField.Entry.Font', fontes.standard)
+        root.option_add('*Listbox*Font',fontes.standard)
+
+  def initializeTk_colors_common(self, root):
+        root.option_add('*background', style.background)
+        root.option_add('*foreground', style.foreground)
+        root.option_add('*EntryField.Entry.background', style.entry_background)
+        root.option_add('*Entry*background', style.entry_background)
+        root.option_add('*Listbox*background', style.list_background)
+        root.option_add('*Listbox*selectBackground', style.list_select_background)
+        root.option_add('*Listbox*selectForeground', style.list_select_foreground)
+
+  def initializeTk_mac(self, root):
+        self.initializeTk_colors_common(root)
+
+  def initializeTk_unix(self, root):
+      root.option_add('*Font', fontes.standard)
+      root.option_add('*EntryField.Entry.Font',fontes.standard )
+      root.option_add('*Listbox*Font', fontes.standard)
+      self.initializeTk_colors_common(root)
+
+  def get_texte_infos(self):
+      """
+          Retourne un texte d'informations sur la session courante d'EFICAS
+      """
+      texte = VERSION + '\n\n'
+      texte = texte + 'EFICAS est un produit développé par \nEDF-R&D\n'
+      texte = texte + 'Equipe : SINETICS\n\n'
+      texte = texte + 'Code utilisé : %s version %s\n' % (self.code,properties.version)
+      return texte
+
+  def efface_aide(self,event):
+      """
+          Efface la bulle d'aide d'un panneau
+      """
+      try:
+          self.aide.destroy()
+      except:
+          pass
+      return
+
+  def affiche_aide(self,event,aide):
+      """
+          Affiche l'aide concernant un panneau
+      """
+      x=event.x
+      y=event.y
+      widget=event.widget
+      self.aide=tooltip.TOOLTIP(widget)
+      self.aide.xoffset = 10
+      self.aide.yoffset = - widget.winfo_height()/2
+      self.aide.setText(aide)
+      self.aide._showTip()
+      return 
+
+  def cree_menu(self,menu,itemlist,appli_composant):
+      """
+          Ajoute les items du tuple itemlist
+          dans le menu menu
+      """
+      number_item=0
+      radio=None
+      for item in itemlist:
+         number_item=number_item + 1
+         raccourci_label=""
+         if not item :
+            #menu.add_separator()
+            pass
+         else:
+            if len(item)==3:
+               raccourci=item[2]
+               raccourci_label="   "+raccourci
+               newitem=(item[0],item[1])
+            else :
+               if len(item)==4:
+                  raccourci=item[2]
+                  raccourci_label="   "+item[3]
+                  newitem=(item[0],item[1])
+               else :
+                  raccourci=""
+                  newitem=item
+            item=newitem
+            label,method=item
+            if type(method) == types.TupleType:
+               # On a un tuple => on cree une cascade
+               menu_cascade=Tkinter.Menu(menu)
+               menu.add_cascade(label=label,menu=menu_cascade)
+               self.cree_menu(menu_cascade,method,appli_composant)
+            elif method[0] == '&':
+               # On a une chaine avec & en tete => on cree un radiobouton
+               command=getattr(appli_composant,method[1:])
+               menu.add_radiobutton(label=label,command=command)
+               if radio == None:radio=number_item
+            else:
+               command=getattr(appli_composant,method)
+               menu.add_command(label=label,accelerator=raccourci_label,command=command)
+               if raccourci != "" :
+                  self.top.bind(raccourci,command)
+      # Si au moins un radiobouton existe on invoke le premier
+      if radio:menu.invoke(radio)
+
+  def fill_menus(self,appli_composant,defs):
+      menudict=self.menubar.menudict
+      for mname,itemlist in defs:
+          menu=menudict.get(mname)
+          if not menu:continue
+          self.cree_menu(menu,itemlist,appli_composant)
+
+  def update_jdc_courant(self):
+      self.bureau.update_jdc_courant()
+
+  def affiche_alerte(self,titre,message):
+      f=Fenetre(self, titre="Compte-rendu d'erreur", texte = titre + "\n\n" + message)
+      f.wait()
+
+
+class valeur:
+   def __init__(self,v=None):
+      self.v=v
+   def set(self,v):
+      self.v=v
+   def get(self):
+      return self.v
+
+class STANDALONE(APPLI):
+   def __init__ (self,code=prefs.code,fichier=None,version='v8.2') :
+      self.code=code
+      self.top=None
+      self.format_fichier=valeur()
+
+      self.dict_reels={}
+      self.liste_simp_reel=[]
+      # L'attribut test doit valoir 1 si on ne veut pas creer les fenetres
+      self.test=1
+      self.titre="STANDALONE POUR TEST"
+
+      # Lecture des parametres de configuration (fichier global editeur.ini
+      # et utilisateur eficas.ini)
+      self.lecture_parametres()
+
+      self.message=''
+      # Avant la creation du bureau qui lit le catalogue
+      self.version_code=version
+      from InterfaceTK import readercata
+      self.readercata=readercata.READERCATA(self,None)
+
+      self.dir=None
+
+   def affiche_infos(self,message):
+      return
+
+   def get_text_JDC(self,JDC,format):
+      if generator.plugins.has_key(format):
+         # Le generateur existe on l'utilise
+         g=generator.plugins[format]()
+         jdc_formate=g.gener(JDC,format='beautifie')
+         return jdc_formate
+      else:
+         # Il n'existe pas c'est une erreur
+         return
+
+   def newJDC(self):
+      CONTEXT.unset_current_step()
+      J=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,
+                                   )
+      J.analyse()
+      return J
+
+   def openJDC(self,file):
+      self.fileName = file
+      e=extension_fichier(file)
+      self.JDCName=stripPath(file)
+      self.initialdir = os.path.dirname(os.path.abspath(file))
+      format=self.format_fichier.get()
+      # 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('exec',self)
+         if not p.cr.estvide():
+             raise ValueError(str(p.cr))
+
+      # On se met dans le repertoire ou se trouve le fichier de commandes
+      # pour trouver les eventuels fichiers include ou autres
+      # localises a cote du fichier de commandes
+      os.chdir(self.initialdir)
+      CONTEXT.unset_current_step()
+      J=self.readercata.cata[0].JdC(procedure=text,
+                                    appli=self,
+                                    cata=self.readercata.cata,
+                                    cata_ord_dico=self.readercata.cata_ordonne_dico,
+                                    nom=self.JDCName,
+                                    rep_mat=self.CONFIGURATION.rep_mat,
+                                   )
+      J.analyse()
+      txt= J.cr.get_mess_exception()
+      if txt:raise ValueError(txt)
+      return J
+
+   def openTXT(self,text):
+      self.JDCName="TEXT"
+      CONTEXT.unset_current_step()
+      J=self.readercata.cata[0].JdC(procedure=text,
+                                    appli=self,
+                                    cata=self.readercata.cata,
+                                    cata_ord_dico=self.readercata.cata_ordonne_dico,
+                                    nom=self.JDCName,
+                                    rep_mat=self.CONFIGURATION.rep_mat,
+                                   )
+      J.analyse()
+      txt= J.cr.get_mess_exception()
+      if txt:raise ValueError(txt)
+      return J
+
+   def create_item(self,obj):
+      return comploader.make_objecttreeitem(self,getattr(obj,"nom","item"),obj)
+
+   def get_file(self,unite=None,fic_origine = ''):
+      """
+          Retourne le nom du fichier correspondant a l unite logique unite (entier)
+          ou d'un fichier poursuite
+      """
+      f,ext=os.path.splitext(fic_origine)
+      if unite :
+          #include
+          finclude=f+".%d" % unite
+      else:
+          #poursuite
+          n=ext[-1]
+          if n == '0':
+             ext=".comm"
+          else: 
+             ext=".com%d" % (string.atoi(n)-1)
+             if ext == '.com0' and not os.path.isfile(f+".com0"):
+                ext=".comm"
+          finclude=f+ext
+      ff=open(finclude)
+      text=ff.read()
+      ff.close()
+      return finclude,text
+
+   def affiche_alerte(self,titre,message):
+      print titre+ "\n\n" + message
diff --git a/InterfaceTK/basestyle.py b/InterfaceTK/basestyle.py
new file mode 100644 (file)
index 0000000..e4287b7
--- /dev/null
@@ -0,0 +1,27 @@
+class STYLE:
+    background='gray90'
+    foreground='black'
+    entry_background='white'
+    list_background='white'
+    list_select_background='#00008b'
+    list_select_foreground='grey'
+    tooltip_background="yellow"
+
+    standard = ("Helvetica",12)
+    standard_italique = ("Helvetica",12,'italic')
+    standard_gras = ("Helvetica",12,'bold')
+    standard_gras_souligne = ("Helvetica",12,'bold','underline')
+
+    canvas = ('Helvetica',10)
+    canvas_italique = ('Helvetica',10,'italic')
+    canvas_gras = ("Helvetica",10,'bold')
+    canvas_gras_italique = ("Helvetica",12,'bold','italic')
+
+    standard12 = ("Helvetica",14)
+    standard12_gras = ("Helvetica",14,'bold')
+    standard12_gras_italique = ( "Helvetica",14,'bold','italic')
+
+    standardcourier10 = ("Courier",14)
+    statusfont = ("Helvetica",16)
+
+style=STYLE()
diff --git a/InterfaceTK/browser.py b/InterfaceTK/browser.py
new file mode 100644 (file)
index 0000000..51c4e3a
--- /dev/null
@@ -0,0 +1,65 @@
+# -*- 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 os,string
+
+# Modules Eficas
+import Interp
+import catabrowser
+import cataediteur
+
+class BROWSER:
+
+   menu_defs=[
+              ('Browsers',[
+                           ('Browser catalogue','browser_catalogue'),
+                           ('Editeur catalogue','edite_catalogue'),
+                           ('Shell','shell'),
+                         ]
+              )
+             ]
+
+   button_defs=[]
+
+   def __init__(self,appli,parent):
+      self.appli=appli
+      self.parent=parent
+      self.cataitem = catabrowser.CATAItem(self,"Catalogue "+self.appli.readercata.code,
+                                           self.appli.readercata.cata,
+                                           objet_cata_ordonne = self.appli.readercata.cata_ordonne_dico)
+
+   def shell(self,event=None):
+      if not hasattr(self.appli.bureau.JDCDisplay_courant,'jdc'):return
+      d={'j':self.appli.bureau.JDCDisplay_courant.jdc}
+      Interp.InterpWindow(d,parent=self.parent)
+
+   def browser_catalogue(self,event=None):
+      catabrowser.CataBrowser(parent=self.parent,appli=self.appli,
+                                cata = self.appli.readercata.cata,
+                                item = self.cataitem)
+
+   def edite_catalogue(self,event=None):
+      cataediteur.CataEditeur(parent=self.parent,appli=self.appli,cata=self.appli.readercata.cata)
+
+
+
diff --git a/InterfaceTK/bureau.py b/InterfaceTK/bureau.py
new file mode 100644 (file)
index 0000000..f9263e0
--- /dev/null
@@ -0,0 +1,768 @@
+# -*- 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 contient la classe BUREAU qui gere les JDC ouverts
+"""
+# Modules Python
+import os,string,sys
+import traceback
+import Pmw
+from widgets import askopenfilename,asksaveasfilename
+from widgets import showinfo,askyesno,showerror
+
+# Modules Eficas
+import splash
+import Aster.prefs
+import convert
+import generator
+import AIDE
+import os
+from jdcdisplay import JDCDISPLAY
+from utils import extension_fichier,stripPath,save_in_file
+from widgets import Fenetre,Ask_Format_Fichier,FenetreSurLigneWarning
+from fenetre_mc_inconnus import fenetre_mc_inconnus
+from Ihm import CONNECTOR
+from Traducteur import traduitV7V8 
+
+from Editeur import comploader
+
+class BUREAU:
+   menu_defs=[
+              ('Fichier',[
+                           ('Nouveau','newJDC','<Control-n>'),
+                           ('Ouvrir','openJDC','<Control-o>'),
+                           ('Enregistrer','saveJDC','<Control-e>'),
+                           ('Enregistrer sous','saveasJDC','<Control-s>'),
+                           None,
+                           ('Fermer','closeJDC','<Control-f>'),
+                           ('Quitter','exitEFICAS','<Control-q>'),
+                         ]
+              ),
+              ('Edition',[
+                           ('Copier','copy','<Control-c>'),
+                           ('Couper','cut','<Control-x>'),
+                           ('Coller','paste','<Control-v>'),
+                         ]
+              ),
+              ('Jeu de commandes',[
+                                   ('Rapport de validation','visuCRJDC','<Control-r>'),
+                                   ('Fichier à plat','visu_a_plat','<Control-p>'),
+                                   ('Fichier .py','visuJDC_py'),
+                                   ('Fichier source','visu_txt_brut_JDC','<Control-b>'),
+                                   ('Paramètres Eficas','affichage_fichier_ini'),
+                                   ('Mots-clés inconnus','mc_inconnus'),
+                                  ]
+              ),
+              ('Traduction',[
+                             ('Traduction v7 en v8','TraduitFichier','<Control-t>','Ctrl+T')
+                            ]
+              ),
+              ('Aide',[
+                        ('Aide EFICAS','aideEFICAS'),
+                      ]
+              ),
+             ]
+
+   button_defs  =      (('New24',"newJDC","Création d'un nouveau fichier",'always'),
+                        ('Open24',"openJDC","Ouverture d'un fichier existant",'always'),
+                        ('Save24',"saveJDC","Sauvegarde du fichier courant",'always'),
+                        ('Fermer24',"closeJDC","Fermeture du fichier courant",'always'),
+                        ('Zoom24',"visuJDC","Visualisation du fichier de commandes",'always'),
+                        None,
+                        ('Copy24',"copy","Copie l'objet courant",'jdc'),
+                        ('Cut24',"cut","Coupe l'objet courant",'jdc'),
+                        ('Paste24',"paste","Colle l'objet copié après l'objet courant",'jdc'),
+                        None,
+                        ('Delete24',"delete","Supprime l'objet courant",'jdc'),
+                        ('Help24',"view_doc","Documentation de l'objet courant",'jdc')
+                       )
+   try:
+      menu_defs=prefs.menu_defs['bureau']
+   except:
+      pass
+   try:
+      button_defs=prefs.button_defs['bureau']
+   except:
+      pass
+
+   def __init__(self,appli,parent):
+      self.parent=parent
+      self.appli=appli
+      if self.appli.test == 0 :
+         splash._splash.configure(text = "Création du bureau")
+      self.nb = Pmw.NoteBook(self.parent,raisecommand=self.selectJDC)
+      self.nb.pack(fill='both',expand=1)
+      self.JDCDisplay_courant=None
+      self.fileName=None
+      self.liste_JDCDisplay=[]
+      comploader.charger_composants()
+      self.cree_cataitem()
+      self.text_reel=""
+      self.initialdir = self.appli.CONFIGURATION.initialdir
+
+   def cree_cataitem(self):
+      """
+          On récupère dans l'appli_composant readercata les variables 
+          qui servent par la suite pour la création des JDC
+      """
+      self.cataitem=self.appli.readercata.cataitem
+      self.cata=self.appli.readercata.cata
+      self.cata_ordonne_dico=self.appli.readercata.cata_ordonne_dico
+      self.code=self.appli.readercata.code
+      self.version_code=self.appli.readercata.version_code
+      self.fic_cata=self.appli.readercata.fic_cata
+
+   def selectJDC(self,event=None):
+      """
+          Cette méthode est appelée chaque fois que l'on sélectionne 
+          l'onglet d'un JDC dans le NoteBook des JDC.
+          Elle permet de stocker dans les variable self.JDC et 
+          self.JDCDisplay_courant les valeurs concernant le JDC courant
+      """
+      if len(self.liste_JDCDisplay) == 0 : return
+      #if self.JDCDisplay_courant : self.JDCDisplay_courant.jdc.unset_context()
+      numero_jdc = self.nb.index(self.nb.getcurselection())
+      self.JDCDisplay_courant.unselect()
+      self.JDCDisplay_courant = self.liste_JDCDisplay[numero_jdc]
+      self.JDC = self.JDCDisplay_courant.jdc
+      self.JDCName = self.JDC.nom
+      self.JDCDisplay_courant.select()
+      #print "selectJDC",numero_jdc,self.JDCDisplay_courant,self.JDCName
+
+
+   def newJDC_include(self,event=None):
+      """
+          Initialise un nouveau JDC include vierge
+      """
+      import Extensions.jdc_include
+      JdC_aux=Extensions.jdc_include.JdC_include
+
+      self.appli.statusbar.reset_affichage_infos()
+
+      CONTEXT.unset_current_step()
+      jaux=self.cata[0].JdC(procedure="",appli=self.appli,
+                         cata=self.cata,cata_ord_dico=self.cata_ordonne_dico,
+                         rep_mat=self.appli.CONFIGURATION.rep_mat,
+                         )
+      jaux.analyse()
+
+      J=JdC_aux(procedure="",appli=self.appli,
+                         cata=self.cata,cata_ord_dico=self.cata_ordonne_dico,
+                         jdc_pere=jaux,
+                         rep_mat=self.appli.CONFIGURATION.rep_mat,
+                         )
+      J.analyse()
+      self.JDCName=J.nom
+      self.fileName=None
+      self.ShowJDC(J,self.JDCName)
+      self.appli.toolbar.active_boutons()
+      return J
+
+   def newJDC(self,event=None):
+      """
+          Initialise un nouveau JDC vierge
+      """
+      self.appli.statusbar.reset_affichage_infos()
+
+      CONTEXT.unset_current_step()
+      J=self.cata[0].JdC(procedure="",appli=self.appli,
+                         cata=self.cata,cata_ord_dico=self.cata_ordonne_dico,
+                         rep_mat=self.appli.CONFIGURATION.rep_mat,
+                         )
+      J.analyse()
+      self.JDCName=J.nom
+      self.fileName=None
+      self.ShowJDC(J,self.JDCName)
+      self.appli.toolbar.active_boutons()
+      return J
+
+   def ShowJDC(self,JDC,nom,label_onglet=None,JDCDISPLAY=JDCDISPLAY,enregistre="non"):
+      """
+          Lance l'affichage du JDC cad création du JDCDisplay
+          Rajoute le JDCDisplay à la liste des JDCDisplay si label_onglet == None cad si on crée
+          bien un nouveau JDCDisplay et non si on remplace (renommage de l'onglet)
+      """
+      self.JDC=JDC
+      self.JDCName = self.JDC.nom = nom
+      if label_onglet == None :
+          # On veut un nouvel onglet
+          label_onglet = self.GetLabelJDC()
+          self.nb.add(label_onglet,tab_text = nom,tab_width=20)
+          new = 'oui'
+      else :
+          new = 'non'
+      self.JDCDisplay_courant=JDCDISPLAY(self.JDC,nom,appli=self.appli,parent=self.nb.page(label_onglet))
+      if new == 'oui':
+          self.liste_JDCDisplay.append(self.JDCDisplay_courant)
+      self.JDCDisplay_courant.modified='n'
+      if enregistre != "non" :
+         self.JDCDisplay_courant.fichier=self.fileName
+      else :
+         self.initialdir = self.appli.CONFIGURATION.rep_user
+      self.nb.selectpage(label_onglet)
+      self.nb.setnaturalsize()
+      self.nb.bind_all("<Key-Next>",lambda e,s=self:s.selectArbreDown())
+      self.nb.bind_all("<Key-Prior>",lambda e,s=self:s.selectArbreUp())
+      self.nb.bind_all("<Insert>",lambda e,s=self:s.deplieReplieNode())
+      texte = "Jeu de commandes :" + self.JDCName+" ouvert"
+      CONNECTOR.Connect(JDC,"close",self.onClose,(self.JDCDisplay_courant,))
+      self.appli.affiche_infos(texte)
+
+   def onClose(self,jdcdisplay):
+      #print "onClose",jdcdisplay
+      self.closeJDCDISPLAY(jdcdisplay)
+
+   def closeJDCDISPLAY(self,jdc):
+      """
+        Ferme le jdcdisplay spécifié par l'argument jdc
+      """
+      if jdc is self.JDCDisplay_courant:
+         # on ferme le jdcdisplay courant
+         self.closeSelectedJDC()
+      else:
+         # on ferme un autre jdcdisplay que le courant
+         old_JDCDisplay=self.JDCDisplay_courant
+         old_page=self.nb.getcurselection()
+
+         self.JDCDisplay_courant=jdc
+         self.JDC=jdc.jdc
+         numero_jdc=self.liste_JDCDisplay.index(jdc)
+         self.nb.selectpage(numero_jdc)
+         #print numero_jdc
+      
+         self.closeSelectedJDC()
+         self.JDCDisplay_courant=old_JDCDisplay
+         self.JDC=old_JDCDisplay.jdc
+         self.nb.selectpage(old_page)
+
+   def closeJDC (self,event=None) :
+      """
+          Ferme le JDC associé au JDCDISPLAY selectionné
+      """
+      if self.JDCDisplay_courant :
+         self.JDCDisplay_courant.jdc.close()
+
+   def closeSelectedJDC (self) :
+      """
+      Ferme le JDC courant et détruit l'onglet associé dans le notebook self.nb
+      """
+      if self.JDCDisplay_courant.modified == 'o' :
+          message = "Voulez-vous sauvegarder le jeu de commandes "+self.JDC.nom+" courant ?"
+          reponse = askyesno(title="Sauvegarde du jdc courant",
+                             message=message)
+          if reponse :
+              test = self.saveJDC()
+              if test == 0 :
+                  self.appli.affiche_infos("Sauvegarde impossible")
+                  return
+
+      CONNECTOR.Disconnect(self.JDCDisplay_courant.jdc,"close",self.onClose,(self.JDCDisplay_courant,))
+      self.JDCDisplay_courant.supprime()
+      self.JDCDisplay_courant.jdc.supprime()
+      self.liste_JDCDisplay.remove(self.JDCDisplay_courant)
+      # Active le mecanisme de selection du notebook (selectJDC)
+      self.nb.delete(self.nb.getcurselection())
+
+      try:
+          index = self.nb.index(self.nb.getcurselection())
+          self.JDCDisplay_courant = self.liste_JDCDisplay[index]
+          self.JDC = self.JDCDisplay_courant.jdc
+      except:
+          self.JDC = None
+          self.JDCDisplay_courant = None
+          self.appli.toolbar.inactive_boutons()
+
+   def visuCRJDC(self,event=None):
+      return self.visuCR(mode='JDC')
+
+   def visuCR(self,mode):
+      """
+      Méthode permettant l'affichage du rapport de validation
+      """
+      if mode == 'JDC':
+          if not hasattr(self,'JDC') : return
+          if self.JDC == None : return
+          titre="rapport de validation du jeu de commandes courant"
+          cr = self.JDC.report()
+          #self.update_jdc_courant()
+      elif mode == 'CATA':
+          from Noyau.N_CR import CR
+          cr = CR()
+          cr.debut = "Début rapport de validation du catalogue"
+          cr.fin = "Fin rapport de validation du catalogue"
+          titre="rapport de validation du catalogue"
+          if hasattr(self,'cata_ordonne_cr') :
+              cr.add(self.cata_ordonne_cr)
+          if hasattr(self,'cata_dev_ordonne_cr') :
+              cr.add(self.cata_dev_ordonne_cr)
+          for cata in self.cata:
+              if hasattr(cata,'JdC'):
+                  cr.add(cata.JdC.report())
+      texte_cr = str(cr)
+      self.visu_texte_cr = Fenetre(self.appli,titre=titre,texte=texte_cr)
+
+   def openJDC(self,event=None,file=None,units=None,enregistre="oui"):
+      """
+          Demande à l'utilisateur quel JDC existant il veut ouvrir
+      """
+      if self.code == 'ASTER':
+          filetypes = ( ("format "+self.appli.format_fichier.get(), ".com*"),("Tous",'*'))
+      elif self.code == 'HOMARD' :
+          filetypes = ( ("format "+self.appli.format_fichier.get(), ".py"),("Tous",'*'))
+      else:
+          filetypes = ( ("format "+self.appli.format_fichier.get(), ".py"),)
+      if not hasattr(self,'initialdir'):
+         self.initialdir = self.appli.CONFIGURATION.initialdir
+
+      if not file :
+          file = askopenfilename(title="Ouverture d'un fichier de commandes Aster",
+                                 defaultextension=".comm",
+                                 filetypes = filetypes,
+                                 initialdir = self.initialdir)
+      if file :
+          self.fileName = file
+          e=extension_fichier(file)
+          self.JDCName=stripPath(file)
+          self.initialdir = os.path.dirname(os.path.abspath(file))
+      else :
+          return
+
+      format=self.appli.format_fichier.get()
+      # 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('exec',self.appli)
+         if not p.cr.estvide(): 
+            self.appli.affiche_infos("Erreur à la conversion")
+            Fenetre(self.appli,
+                    titre="compte-rendu d'erreurs, EFICAS ne sait pas convertir ce fichier",
+                    texte = str(p.cr)).wait()
+            return
+         if enregistre == "oui" :
+            self.appli.listeFichiers.aOuvert(file)
+      else:
+         # Il n'existe pas c'est une erreur
+         self.appli.affiche_infos("Type de fichier non reconnu")
+         showerror("Type de fichier non reconnu","EFICAS ne sait pas ouvrir ce type de fichier")
+         return
+
+      # On se met dans le repertoire ou se trouve le fichier de commandes
+      # pour trouver les eventuels fichiers include ou autres
+      # localises a cote du fichier de commandes
+      os.chdir(self.initialdir)
+      CONTEXT.unset_current_step()
+      J=self.cata[0].JdC(procedure=text,appli=self.appli,
+                         cata=self.cata,cata_ord_dico=self.cata_ordonne_dico,
+                         nom = self.JDCName,
+                         rep_mat=self.appli.CONFIGURATION.rep_mat,
+                         )
+      if units is not None:
+         J.recorded_units=units
+         J.old_recorded_units=units
+
+      J.analyse()
+      txt_exception = J.cr.get_mess_exception()
+      if txt_exception :
+          # des exceptions ont été levées à la création du JDC 
+          # --> on affiche les erreurs mais pas le JDC
+          self.JDC=J
+          self.appli.affiche_infos("Erreur fatale au chargement de %s" %file)
+          if self.appli.test == 0 :
+             showerror("Erreur fatale au chargement d'un fichier",txt_exception)
+      else:
+          self.ShowJDC(J,self.JDCName,enregistre=enregistre)
+          self.appli.toolbar.active_boutons()
+          # si le JDC ne contient rien (vide), on retourne ici
+          if len(self.JDC.etapes) == 0 : return
+          # dans le cas où le JDC est invalide, on affiche son CR
+          if not self.JDC.isvalid():
+             self.appli.top.update()
+             self.visuCR(mode='JDC')
+      return J
+
+   def deplieReplieNode(self):
+       self.JDCDisplay_courant.tree.tree.deplieReplieNode()
+
+   def selectArbreDown(self):
+       self.JDCDisplay_courant.tree.tree.canvas.focus_set()
+       self.JDCDisplay_courant.tree.tree.mot_down_force()
+
+   def selectArbreUp(self):
+       self.JDCDisplay_courant.tree.tree.canvas.focus_set()
+       self.JDCDisplay_courant.tree.tree.mot_up_force()
+
+   def GetLabelJDC(self,nb_jdc = 'absent'):
+      """
+      Retourne le label de l'onglet du NoteBook associé au JDC à afficher
+      """
+      if nb_jdc == 'absent':
+          nb_jdc = len(self.nb.pagenames())
+      nb_jdc = nb_jdc+1
+      label_onglet = 'JDC'+`nb_jdc`
+      if label_onglet not in self.nb.pagenames() :
+          return label_onglet
+      else :
+          return self.GetLabelJDC(nb_jdc)
+
+   def saveasJDC(self,event=None):
+      """ 
+           Sauvegarde le JDC courant en demandant impérativement à l'utilisateur de
+           donner le nom du fichier de sauvegarde 
+      """
+      self.saveJDC(echo='oui')
+
+   def saveJDC(self,echo='non'):
+      """ 
+          Sauvegarde le JDC courant.
+          Retourne 1 si la sauvegarde s'est bien faite, 0 sinon.
+
+            - Si echo = 'oui' : interactif (l'utilisateur donne le nom sous lequel il 
+                            veut sauver le JDC
+            - Si echo = 'non' : muet (sauvegarde le JDC dans JDC.procedure)
+      """
+      ok = 0
+      if not hasattr(self,'JDC') : return 0
+      format=self.appli.format_fichier.get()
+      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 == 'homard':
+            self.jdc_homard=g.get_homard()
+         if not g.cr.estvide():
+            self.appli.affiche_infos("Erreur à la generation")
+            showerror("Erreur à la generation","EFICAS ne sait pas convertir ce JDC")
+            return
+      else:
+         # Il n'existe pas c'est une erreur
+         self.appli.affiche_infos("Format %s non reconnu" % format)
+         showerror("Format %s non reconnu" % format,"EFICAS ne sait pas convertir le JDC")
+         return
+      self.jdc_fini = string.replace(jdc_formate,'\r\n','\n')
+
+      if echo =='oui' or self.JDCDisplay_courant.fichier == None:
+         ok = self.asknomsauvegardeJDC()
+      elif self.JDCDisplay_courant.fichier != None :
+         # le JDC a déjà un nom : on sauvegarde directement sans demander
+         # un autre nom au développeur
+         if not save_in_file(self.JDCDisplay_courant.fichier,self.jdc_fini,self.appli.dir) :
+              showinfo("Erreur","Problème à la sauvegarde du fichier :" + `self.JDCDisplay_courant.fichier`)
+              #return 0
+              ok = 0
+         else :
+              if self.appli.format_fichier.get() == 'homard':
+                  self.save_homard(self.JDCDisplay_courant.fichier,self.jdc_homard)
+              self.JDCDisplay_courant.stop_modif()
+              self.appli.affiche_infos("sauvegarde de "+`self.JDCDisplay_courant.fichier`+" effectuée")
+              ok = 1
+
+      if ok and hasattr( self.appli, 'salome'):
+         # eficas a été lancé à partir deSalome
+         #1)ajout dans l'arbre d'étude du nom du jdc
+         ok, msg = self.appli.addJdcInSalome( self.JDCDisplay_courant.fichier )
+
+         #2)CS_pbruno ??
+         from panelsSalome import SALOME_UNIQUE_BASE_Panel
+         if len(SALOME_UNIQUE_BASE_Panel.dict_fichier_unite) > 0 :
+            print 'CS_pbruno if len(SALOMchier_unite) > 0 :???????'
+            self.appli.creeConfigTxt( self.appli.CONFIGURATION.initialdir, SALOME_UNIQUE_BASE_Panel.dict_fichier_unite )
+
+         #3)création/mise à jours d'un maillage dans Salome
+         self.appli.createOrUpdateMesh()
+      return ok
+
+   def asknomsauvegardeJDC(self):
+      """ Demande à l'utilsateur le nom sous lequel il veut sauvegarder le JDC courant """
+      titre = "Sauvegarde d'un fichier de commandes "+self.code
+      if self.code == 'ASTER':
+          defext = ".comm"
+          filtyp = ( ("ASTER", ".comm"),)
+      else :
+          defext = ".py"
+          filtyp = ( (self.code, ".py"),)
+      sauvegarde = asksaveasfilename(title=titre,
+                                     defaultextension=defext,
+                                     filetypes = filtyp,
+                                     initialdir = self.initialdir)
+                            #initialdir = self.appli.CONFIGURATION.initialdir)
+                            #initialdir = self.appli.CONFIGURATION.rep_user)
+      if sauvegarde :
+          if not save_in_file(sauvegarde,self.jdc_fini,None) :
+              showinfo("Erreur","Problème à la sauvegarde du fichier "+`sauvegarde`)
+              return 0
+          else :
+              if self.appli.format_fichier.get() == 'homard':
+                  self.save_homard(sauvegarde,self.jdc_homard)
+              self.JDCDisplay_courant.stop_modif()
+              self.appli.affiche_infos("Sauvegarde effectuée")
+              if sauvegarde != self.JDCDisplay_courant.fichier :
+                  # l'utilisateur a sauvegardé le JDC sous un autre nom
+                  self.JDCDisplay_courant.fichier = sauvegarde
+                  self.JDCName = self.JDC.nom = stripPath(sauvegarde)
+                  self.JDC.changefichier(sauvegarde)
+                  self.changeNomPage()
+              return 1
+      else :
+          return 0
+
+   def changeNomPage(self):
+      """ Change le nom de l'onglet contenant le JDC courant : en fait détruit l'actuel
+          et recrée un autre onglet à la même place avec le bon nom 
+      """
+      nom = self.JDCName
+      self.JDCDisplay_courant.jdc.nom = nom
+      nom_page = self.nb.getcurselection()
+      num_page = self.nb.index(nom_page)
+      tab = self.nb.tab(num_page)
+      tab.configure(text = nom)
+
+   def exitEFICAS(self,event=None):
+      """
+          Permet de sortir d'EFICAS en demandant à l'utilisateur
+          s'il veut sauvegarder les modifications en cours
+      """
+      liste = self.GetListeJDCaSauvegarder()
+      if liste != [] :
+          # Certains fichiers n'ont pas été sauvegardés ...
+          if askyesno("Enregistrer modifications","Enregistrer les modifications ?") :
+              test = self.saveall(liste)
+              if test != 1 :
+                  return
+      if askyesno ("Quitter","Voulez-vous vraiment quitter l'application ?") :
+          for JDCDisplay in self.liste_JDCDisplay:
+              JDCDisplay.jdc.supprime()
+          self.appli.quit()
+          return
+
+   def GetListeJDCaSauvegarder(self) :
+      """ Retourne parmi la liste de tous les JDC ouverts la liste de ceux qui ont été modifiés """
+      if not self.JDCDisplay_courant : return []
+      if len(self.liste_JDCDisplay) == 0 : return l
+      l = []
+      for JDCDisplay in self.liste_JDCDisplay:
+          if JDCDisplay.modified == 'o' :
+              l.append(JDCDisplay)
+      return l
+
+   def copy(self,event=None):
+      """
+          Lance la copie sur le JDC courant
+      """
+      if self.JDCDisplay_courant : self.JDCDisplay_courant.doCopy()
+
+   def paste(self,event=None):
+      """
+           Lance le collage sur le JDC courant
+      """
+      if self.JDCDisplay_courant : self.JDCDisplay_courant.doPaste()
+
+   def cut(self,event=None):
+      """
+         Lance le cut sur le JDC courant
+      """
+      if self.JDCDisplay_courant: self.JDCDisplay_courant.doCut()
+
+   def delete(self):
+      """
+          Lance la suppression du noeud courant
+      """
+      if not self.JDCDisplay_courant : return
+      self.JDCDisplay_courant.init_modif()
+      self.JDCDisplay_courant.node_selected.delete()
+
+   def visuJDC_py(self,event=None):
+      """ 
+          Méthode permettant d'afficher dans une fenêtre à part l'écho au 
+          format python du jdc courant 
+      """
+      if not hasattr(self,'JDC') : return
+      jdc_fini = self.get_text_JDC('python')
+      if jdc_fini == None : return
+      Fenetre(self.appli,
+              titre = 'fichier '+ self.JDCName + ' à la syntaxe Python',
+              texte = jdc_fini)
+
+   def visuJDC(self):
+      """ 
+          Méthode permettant d'afficher dans une fenêtre à part l'écho au 
+          format .comm ou .py du jdc courant 
+      """
+      if not hasattr(self,'JDC') : return
+      titre = 'fichier '+ self.JDCName + ' à la syntaxe '+ self.code
+      format=self.appli.format_fichier.get()
+      self.jdc_fini = self.get_text_JDC(format)
+      if self.jdc_fini == None : return
+      self.visu_fichier_cmd = Fenetre(self.appli,titre=titre,texte = self.jdc_fini)
+
+   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 not g.cr.estvide():
+            self.appli.affiche_infos("Erreur à la generation")
+            showerror("Erreur à la generation","EFICAS ne sait pas convertir ce JDC")
+            return
+         else:
+            return jdc_formate
+      else:
+         # Il n'existe pas c'est une erreur
+         self.appli.affiche_infos("Format %s non reconnu" % format)
+         showerror("Format %s non reconnu" % format,"EFICAS ne sait pas convertir le JDC en format %s "% format)
+         return
+
+   def view_doc(self):
+      """
+          Permet d'ouvrir le fichier doc U de la commande au format pdf avec Acrobat Reader
+          - Ne fonctionne pas sous UNIX (chemin d'accès Acrobat Reader)
+          - indication du chemin d'accès aux fichiers pdf à revoir : trop statique
+      """
+      if not self.JDCDisplay_courant : return
+      try:
+          cle_doc = self.JDCDisplay_courant.node_selected.item.get_docu()
+          if cle_doc == None : return
+          cle_doc = string.replace(cle_doc,'.','')
+          cle_doc = string.replace(cle_doc,'-','')
+          commande = self.appli.CONFIGURATION.exec_acrobat
+          nom_fichier = cle_doc+".pdf"
+          fichier = os.path.abspath(os.path.join(self.appli.CONFIGURATION.path_doc,nom_fichier))
+          if os.name == 'nt':
+              os.spawnv(os.P_NOWAIT,commande,(commande,fichier,))
+          elif os.name == 'posix':
+              script ="#!/usr/bin/sh \n%s %s&" %(commande,fichier)
+              pid = os.system(script)
+      except AttributeError:
+          traceback.print_exc()
+          pass
+
+   def visu_a_plat(self,event=None):
+      """ 
+          Méthode permettant d'afficher dans une fenêtre à part l'écho 'à plat' du jdc courant 
+      """
+      if not hasattr(self,'JDC') : return
+      titre = 'fichier '+ self.JDCName + ' à plat '
+      self.jdc_fini = self.get_text_JDC('aplat')
+      if self.jdc_fini == None : return
+      self.visu_fichier_cmd = Fenetre(self.appli,titre=titre,texte = self.jdc_fini)
+
+   def visu_txt_brut_JDC(self,event=None):
+      """
+           Méthode permettant d'afficher le jeu de commandes tel qu'il a été passé au JDC
+      """
+      if not hasattr(self,'JDC') : return
+      titre = "fichier de commandes utilisateur"
+      #texte = self.JDC.procedure
+      #if texte == None:
+      if self.JDCDisplay_courant.fichier == None:
+            self.appli.affiche_infos("Pas de fichier initial")
+            showerror("Impossible de visualiser le fichier initial",
+                      "EFICAS ne peut visualiser le fichier initial.\nIl s'agit d'un nouveau JDC")
+            return
+      os.chdir(self.appli.dir)
+      f=open(self.JDCDisplay_courant.fichier,'r')
+      texte=f.read()
+      f.close()
+      self.visu_texte_JDC = Fenetre(self.appli,titre=titre,texte=texte)
+
+   def affichage_fichier_ini(self):
+      """
+           Affichage des valeurs des paramètres relus par Eficas
+      """
+      self.appli.CONFIGURATION.affichage_fichier_ini()
+
+   def saveall(self,liste):
+      """ 
+           Sauvegarde tous les JDC contenus dans liste 
+      """
+      test = 1
+      for JDCDisplay in liste :
+          self.JDCDisplay_courant=JDCDisplay
+          self.JDC = JDCDisplay.jdc
+          test = test * self.saveJDC(echo = 'non')
+      return test
+
+   def save_homard(self,nom,texte):
+       file_homard=nom+'.conf_homard'
+       try:
+           f=open(file_homard,'w')
+           for ligne in texte:
+               f.write(ligne)
+               f.write('\n')
+           f.close()
+       except:
+           print "Pb a la sauvegarde sous le format homard"
+       if hasattr( self.appli, 'salome'):
+           import eficasEtude
+           self.appli.salome.rangeInStudy(file_homard,"_CONF")
+
+# ---------------------------------------------------------------------------
+#                             Méthodes liées aux mots-clés inconnus
+# ---------------------------------------------------------------------------
+
+   def mc_inconnus(self):
+      l_mc = self.JDCDisplay_courant.jdc.get_liste_mc_inconnus()
+      o = fenetre_mc_inconnus(l_mc)
+      l = o.wait_new_list()
+      #print "mc_inconnus_new_list: ",l
+      #CCAR: Il n' y a pas de retour vers le JDC
+
+   def aideEFICAS(self,event=None):
+      AIDE.go(master=self.parent)
+
+   def update_jdc_courant(self):
+      self.JDCDisplay_courant.update()
+
+   def TraduitFichier(self):
+      directory = self.appli.CONFIGURATION.rep_user
+      FichieraTraduire = askopenfilename(title="Nom du  Fichier à Traduire",
+                                 defaultextension=".comm",
+                                 initialdir = directory 
+                                 )
+      if (FichieraTraduire == "" or FichieraTraduire == () ) : return
+      i=FichieraTraduire.rfind(".")
+      Feuille=FichieraTraduire[0:i]
+      FichierTraduit=Feuille+"v8.comm"
+      log=self.initialdir+"/convert.log"
+      os.system("rm -rf "+log)
+      os.system("rm -rf "+FichierTraduit)
+      Pmw.showbusycursor()
+      traduitV7V8.traduc(FichieraTraduire,FichierTraduit,log)
+      Pmw.hidebusycursor()
+      Entete="Fichier Traduit : "+FichierTraduit +"\n\n"
+      titre = "conversion de "+ FichieraTraduire
+
+      if  os.stat(log)[6] != 0L :
+          f=open(log)
+          texte_cr= f.read()
+          f.close()
+      else :
+          texte_cr = Entete  
+          commande="diff "+FichieraTraduire+" "+FichierTraduit+" >/dev/null"
+          try :
+            if os.system(commande) == 0 :
+               texte_cr = texte_cr + "Pas de difference entre le fichier V7 et le fichier traduit"
+          except :
+               pass
+
+      cptrendu = FenetreSurLigneWarning(self.appli,titre=titre,texte=texte_cr)
+
diff --git a/InterfaceTK/catabrowser.py b/InterfaceTK/catabrowser.py
new file mode 100644 (file)
index 0000000..c3a3808
--- /dev/null
@@ -0,0 +1,398 @@
+# -*- 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 os
+import sys
+import types
+import string
+import Pmw
+from Tkinter import *
+
+# Modules Eficas
+from InterfaceTK import fontes
+from treewidget import Tree
+from Editeur.Objecttreeitem import TreeItem
+from Accas import AsException
+from Noyau.N_CR import justify_text
+from Accas import OPER,PROC,MACRO,FORM
+from Accas import FACT,BLOC,SIMP
+
+#
+__version__="$Name: BR_V1_12qt $"
+__Id__="$Id: catabrowser.py,v 1.4 2004-09-10 15:51:48 eficas Exp $"
+#
+class Tableau:
+  incr = 10
+  def __init__(self,parent,colonnes):
+    self.parent = parent
+    self.colonnes = colonnes
+    self.init()
+
+  def init(self):
+    # recherche du nombre maxi de lignes et de colonnes....
+    for col in self.colonnes :
+      nb_l = 0
+      if len(col) > nb_l : nb_l = len(col)
+    self.nb_lignes = nb_l
+    self.nb_colonnes = len(self.colonnes)
+    # initialisation des coordonnées dans le canvas
+    self.x0 = self.incr
+    self.y0 = self.incr
+    self.x = self.x0 + self.incr
+    self.y = self.y0 + self.incr
+
+  def affiche(self):    
+    self.scrolledcanvas=Pmw.ScrolledCanvas(self.parent,
+                                           hull_width=1.,
+                                           hull_height=1.,
+                                           borderframe=1)
+    Pmw.Color.changecolor(self.scrolledcanvas.component('canvas'),background='gray95')
+    self.scrolledcanvas.pack(padx=10,pady=10,expand=1, fill="both")
+    self.canvas = self.scrolledcanvas.component('canvas')
+    self.affiche_colonnes()
+
+  def affiche_colonnes(self):
+    for i in range(self.nb_lignes):
+      self.affiche_ligne(i)
+    self.aligne_colonnes()
+    self.trace_traits()
+    self.scrolledcanvas.resizescrollregion()
+
+  def get_xy_max(self):
+    try:
+      x0,y0,xmax,ymax = self.canvas.bbox(ALL)
+      return xmax,ymax
+    except:
+      return None,None
+    
+  def trace_traits(self):
+    xmax,ymax = self.get_xy_max()
+    if not xmax : return
+    xmax = xmax+self.incr
+    ymax = ymax+self.incr
+    # trace les traits horizontaux
+    for i in range(self.nb_lignes):
+      tag_lig = 'ligne_'+`i`
+      l_id = self.canvas.find_withtag(tag_lig)
+      x0,y0,x1,y1 = self.bbox(l_id)
+      self.canvas.create_line(x0-self.incr,y0-self.incr,xmax,y0-self.incr)
+    self.canvas.create_line(self.x0,ymax,xmax,ymax)  
+    # trace les traits verticaux
+    for j in range(self.nb_colonnes):
+      tag_col = 'colonne_'+`j`
+      l_id = self.canvas.find_withtag(tag_col)
+      x0,y0,x1,y1 = self.bbox(l_id)
+      self.canvas.create_line(x0-self.incr,y0-self.incr,x0-self.incr,ymax)
+    self.canvas.create_line(xmax,self.y0,xmax,ymax)
+    
+  def bbox(self,l_id):
+    x0,y0,x1,y1 = self.canvas.bbox(l_id[0])
+    for id in l_id[1:]:
+      x2,y2,x3,y3 = self.canvas.bbox(id)
+      x0 = min(x2,x0)
+      y0 = min(y2,y0)
+      x1 = max(x3,x1)
+      y1 = max(y3,y1)
+    return x0,y0,x1,y1
+  
+  def affiche_ligne(self,num_lig):
+    tag_lig = 'ligne_'+`num_lig`
+    num_col = 0
+    for col in self.colonnes:
+      tag_col = 'colonne_'+`num_col`
+      x = 100*num_col+self.x
+      id = self.canvas.create_text(x,self.y,
+                                   text = justify_text(col[num_lig],cesure=60),
+                                   tag=(tag_lig,tag_col),
+                                   anchor='nw',
+                                   font = fontes.canvas)
+      x0,y0,x1,y1 = self.canvas.bbox(id)
+      num_col = num_col+1
+    l_id = self.canvas.find_withtag(tag_lig)
+    x0,y0,x1,y1 = self.bbox(l_id)
+    self.y = y1 + 2*self.incr
+
+  def aligne_colonnes(self):
+    num_col = 0
+    for col in self.colonnes:
+      tag_col = 'colonne_'+`num_col`
+      l_id = self.canvas.find_withtag(tag_col)
+      if not l_id : continue
+      x0,y0,x1,y1 = self.bbox(l_id)
+      self.move(x1+self.incr,self.colonnes[num_col+1:],num_col+1)
+      num_col = num_col+1
+
+  def move(self,x,colonnes,num):
+    num_col = num
+    for col in colonnes:
+      tag_col = 'colonne_'+`num_col`
+      l_id = self.canvas.find_withtag(tag_col)
+      if not l_id : continue
+      x0,y0,x1,y1 = self.canvas.bbox(l_id[0])
+      self.canvas.move(tag_col,x+self.incr-x0,0)
+      num_col = num_col+1
+    
+class CATAPanel(Frame) :
+  """ Classe servant à créer le panneau représentant l'objet sélectionné dans l'arbre"""
+  def __init__(self,parent,panneau,node) :
+    self.parent=parent
+    self.panneau = panneau
+    self.node=node
+    Frame.__init__(self,self.panneau)
+    self.place(x=0,y=0,relheight=1,relwidth=1)
+    self.init()
+
+  def init(self):
+    # création du label initial
+    label = Label(self,
+                  text = 'Attributs de '+self.node.item.labeltext,
+                  font = fontes.standard_gras_souligne)
+    label.pack(side='top',pady=10)
+    # création des listes correspondant aux colonnes du tableau à afficher
+    colonne1,colonne2 = self.get_listes()
+    # affichage du tableau
+    self.tableau = Tableau(self,(colonne1,colonne2))
+    self.tableau.affiche()
+
+  def get_listes(self):    
+    self.node.item.get_dico_attributs()
+    l_cles_attributs = self.node.item.d_attributs.keys()
+    l_cles_attributs.sort()
+    ind=0
+    liste1 = []
+    liste2=[]
+    for nom_attr in l_cles_attributs :
+      valeur = self.node.item.d_attributs[nom_attr]
+      if type(valeur) == types.TupleType:
+        texte =''
+        for elem in valeur:
+          if type(elem) == types.ClassType:
+            texte = texte + elem.__name__
+          else:
+            texte = texte + str(elem)
+      elif type(valeur) == types.ClassType :
+        texte = valeur.__name__
+      else:
+        texte = str(valeur)
+      liste1.append(nom_attr)
+      liste2.append(texte)
+    return liste1,liste2
+
+class CATAItem(TreeItem):
+  panel = CATAPanel
+  def __init__(self,appli,labeltext,object,setfunction=None,objet_cata_ordonne = None):
+    self.appli = appli
+    self.labeltext = labeltext
+    self.object=object
+    self.setfunction = setfunction
+    self.objet_cata_ordonne = objet_cata_ordonne
+
+  def get_dico_fils(self):
+    d_fils = {}
+    if type(self.object) != types.TupleType:
+      for e in dir(self.object):
+        cmd = getattr(self.object,e)
+        if isCMD(cmd) :
+          d_fils[string.strip(cmd.nom)] = cmd
+    else:
+      for obj in self.object :
+        for e in dir(obj):
+          cmd = getattr(obj,e)
+          if isCMD(cmd) :
+            d_fils[string.strip(cmd.nom)] = cmd
+    self.d_fils = d_fils
+
+  def get_dico_attributs(self):
+    d_attributs ={}
+    if type(self.object) == types.TupleType :
+      self.d_attributs = d_attributs
+      return
+    l_noms_attributs = ['nom','op','sd_prod','reentrant','repetable','fr','docu','into','valide_vide','actif',
+                        'regles','op_init','niveau','definition','code','niveaux','statut',
+                        'defaut','min','max','homo','position','val_min','val_max','condition']
+    for nom_attribut in l_noms_attributs :
+      if hasattr(self.object,nom_attribut):
+        attr = getattr(self.object,nom_attribut)
+        d_attributs[nom_attribut] = attr
+    self.d_attributs = d_attributs
+
+  def get_liste_mc_ordonnee(self):
+    """ Retourne la liste ordonnée (suivant le catalogue) brute des fils
+    de l'entite courante """
+    if hasattr(self.objet_cata_ordonne,'ordre_mc'):
+      return self.objet_cata_ordonne.ordre_mc
+    else :
+      l=self.objet_cata_ordonne.keys()
+      l.sort()
+      return l
+      
+  def GetLabelText(self):
+    return self.labeltext,None,None
+
+  def get_fr(self):
+    return ''
+  
+  def isMCList(self):
+    return 0
+  
+  def GetSubList(self):
+    sublist=[]
+    if not hasattr(self,'d_fils'):
+      self.get_dico_fils()
+    # on classe les fils dans l'odre du catalogue ...
+    l_cles_fils = self.get_liste_mc_ordonnee()
+    for k in l_cles_fils :
+      if type(self.objet_cata_ordonne) == types.InstanceType :
+        objet_cata = self.objet_cata_ordonne.entites[k]
+      else :
+        objet_cata = self.objet_cata_ordonne.get(k,None)
+      item = make_objecttreeitem(self.appli,k + " : ",self.d_fils[k],
+                                 objet_cata_ordonne = objet_cata)
+      sublist.append(item)
+    return sublist
+
+  def GetIconName(self):
+    return 'ast-green-square'
+
+  def isactif(self):
+    return 1
+  
+class CMDItem(CATAItem):
+
+  def get_dico_fils(self):
+    self.d_fils = self.object.entites
+
+class SIMPItem(CATAItem):
+  d_fils={}
+  d_attributs={}
+
+  def GetIconName(self):
+    return 'ast-green-ball'
+
+  def IsExpandable(self):
+    return 0
+  
+class FACTItem(CMDItem):
+  def GetIconName(self):
+    return 'ast-green-los'
+
+class BLOCItem(FACTItem): pass
+
+class ATTRIBUTItem(SIMPItem):
+  def get_dico_attributs(self):
+    self.d_attributs = {}
+
+  def GetSubList(self):
+    return []
+
+  def IsExpandable(self):
+    return 0
+
+  def GetText(self):
+    return self.object
+
+  def GetIconName(self):
+    return 'aucune'  
+
+class CataBrowser:
+  def __init__(self,parent,appli,cata,item = None):
+    self.parent = parent
+    self.cata = cata
+    self.appli = appli
+    self.item = item
+    self.init()
+
+  def close(self):
+    self.top.destroy()
+
+  def init(self):
+    self.nodes={}
+    self.top = Pmw.Dialog(self.parent,
+                          title = "Visualisation d'un catalogue",
+                          buttons=('OK',),
+                          command = self.quit)
+    self.pane = Pmw.PanedWidget(self.top.component('dialogchildsite'),
+                                hull_width = 800,
+                                hull_height = 500,
+                                orient = 'horizontal')
+    self.pane.add('canvas',min = 0.4, max = 0.6, size = 0.5)
+    self.pane.add('panel',min = 0.4, max = 0.6, size = 0.5)
+    self.pane.pack(expand =1, fill = 'both')
+    self.scrolledcanvas = Pmw.ScrolledCanvas(self.pane.pane('canvas'),
+                                             hull_width=1.,
+                                             hull_height=1.,
+                                             borderframe=1)
+    Pmw.Color.changecolor(self.scrolledcanvas.component('canvas'),background='gray95')
+    self.scrolledcanvas.pack(padx=10,pady=10,expand=1, fill="both")
+    if self.item == None :
+      self.item = CATAItem(self.appli,"Catalogue",self.cata)
+    self.tree = Tree(self.appli,self.item,self.scrolledcanvas,command = self.select_node)
+    self.tree.draw()
+    self.node = self.tree.node_selected
+
+  def select_node(self,node):
+    self.nodes[node]=self.create_panel(node)
+
+  def create_panel(self,node):
+    if hasattr(node.item,"panel"):
+      return getattr(node.item,"panel")(self,self.pane.pane('panel'),node)
+      
+  def quit(self,nom_bouton) :
+    self.top.destroy()
+    
+  def settitle(self):
+    self.top.wm_title("Browser de catalogue " )
+    self.top.wm_iconname("CataBrowser")
+
+dispatch = {
+    OPER  : CMDItem,
+    PROC  : CMDItem,
+    MACRO  : CMDItem,
+    SIMP : SIMPItem,
+    FACT : FACTItem,
+    BLOC : BLOCItem,
+}
+
+def TYPE(o):
+  if isinstance(o,OPER):return OPER
+  elif isinstance(o,PROC):return PROC
+  elif isinstance(o,MACRO):return MACRO
+  elif isinstance(o,FORM):return MACRO
+  elif isinstance(o,SIMP):return SIMP
+  elif isinstance(o,FACT):return FACT
+  elif isinstance(o,BLOC):return BLOC
+  else:return type(o)
+
+def make_objecttreeitem(appli,labeltext, object, setfunction=None,objet_cata_ordonne=None):
+    t = TYPE(object)
+    if dispatch.has_key(t):
+      c = dispatch[t]
+    else:
+      #print 'on a un objet de type :',t,'  ',object
+      c = ATTRIBUTItem
+    return c(appli,labeltext, object, setfunction = setfunction,objet_cata_ordonne=objet_cata_ordonne)
+
+def isCMD(cmd):
+   return isinstance(cmd,OPER) or isinstance(cmd,PROC) or isinstance(cmd,MACRO) or isinstance(cmd,FORM)
+
+
+
diff --git a/InterfaceTK/cataediteur.py b/InterfaceTK/cataediteur.py
new file mode 100644 (file)
index 0000000..6b51fe0
--- /dev/null
@@ -0,0 +1,975 @@
+# -*- 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 os
+import sys
+import types
+import string
+import Pmw
+from widgets import showinfo
+from Tkinter import *
+
+# Modules Eficas
+from InterfaceTK import fontes
+from widgets import *
+from treewidget import Tree
+from Editeur.Objecttreeitem import TreeItem
+from Accas import AsException
+from Noyau.N_CR import justify_text
+
+from Accas import ASSD,GEOM
+import definition_cata
+
+#
+__version__="$Name: BR_V1_12qt $"
+__Id__="$Id: cataediteur.py,v 1.9 2005-12-07 10:17:21 eficas Exp $"
+#
+
+Fonte_Niveau = fontes.canvas_gras_italique
+
+class Panel(Frame) :
+  """ Classe servant de classe mère à toutes celles représentant les
+      panneaux à afficher en fonction de la nature de l'objet en cours
+      Elle est toujours dérivée."""
+  def __init__(self,parent,panneau,node) :
+      self.parent=parent
+      self.panneau = panneau
+      self.node=node
+      Frame.__init__(self,self.panneau)
+      self.place(x=0,y=0,relheight=1,relwidth=1)
+      #self.creer_boutons()
+      self.init()
+
+  def creer_boutons(self):
+      """ Méthode créant les boutons se trouvant dans la partie contextuelle d'EFICAS
+      (à droite sous les onglets ) """
+      self.fr_but = Frame(self,height=30)
+      self.fr_but.pack(side='bottom',fill='x')
+      self.bouton_com = Button(self.fr_but,
+                               text = 'Commentaire',
+                               command = self.ajout_commentaire,
+                               width=14)
+      self.bouton_sup = Button(self.fr_but,
+                               text = "Supprimer",
+                               command=self.supprimer,
+                               width=14)
+      self.bouton_doc = Button(self.fr_but,
+                               text="Documentation",
+                               command=self.visu_doc,
+                               width=14)
+      self.bouton_cata = Button(self.fr_but,
+                                text = "Catalogue",
+                                command = self.show_catalogue,
+                                width=14)
+      if self.parent.appli.CONFIGURATION.isdeveloppeur == 'OUI':
+          self.bouton_sup.place(relx=0.25,rely = 0.5,relheight = 0.8,anchor='w')
+          self.bouton_cata.place(relx=0.5,rely = 0.5,relheight = 0.8,anchor='w')
+          self.bouton_doc.place(relx=0.75,rely = 0.5,relheight = 0.8,anchor='w')
+      else:
+          self.bouton_sup.place(relx=0.3,rely = 0.5,relheight = 0.8,anchor='w')
+          self.bouton_doc.place(relx=0.7,rely = 0.5,relheight = 0.8,anchor='w')
+
+  def show_catalogue(self):
+      try:
+          genea = self.node.item.get_genealogie()
+          self.parent.appli.browser_catalogue_objet(genea)
+      except Exception,e:
+          traceback.print_exc()
+      
+  def efface(self):
+      self.node.efface()
+      
+  def ajout_commentaire(self,ind='after'):
+      """ Ajoute un commentaire à l'intérieur du JDC, par défaut après le noeud en cours"""
+      if self.parent.modified == 'n' : self.parent.init_modif()
+      return self.node.append_brother("COMMENTAIRE",ind)
+    
+  def ajout_commentaire_first(self):
+      """ Ajoute un commentaire en début de JDC"""
+      if self.parent.modified == 'n' : self.parent.init_modif()
+      return self.node.append_child("COMMENTAIRE",'first')
+        
+  def visu_doc(self):
+      """ Permet d'ouvrir le fichier doc U de la commande au format pdf avec Acrobat Reader
+        - Ne fonctionne pas sous UNIX (chemin d'accès Acrobat Reader)
+        - indication du chemin d'accès aux fichiers pdf à revoir : trop statique"""
+      cle_doc = self.parent.appli.get_docu(self.node)
+      if cle_doc == None : return
+      cle_doc = string.replace(cle_doc,'.','')
+      commande = self.parent.appli.CONFIGURATION.exec_acrobat
+      nom_fichier = cle_doc+".doc"
+      rep_fichier = cle_doc[0:2]
+      fichier = os.path.abspath(os.path.join(self.parent.appli.CONFIGURATION.path_doc,rep_fichier,nom_fichier))
+      print 'commande =',commande
+      print 'fichier =',fichier
+      print 'existe =',os.path.isfile(fichier)
+      if os.name == 'nt':
+          os.spawnv(os.P_NOWAIT,commande,(commande,fichier))
+      elif os.name == 'posix':
+          script ="#!/usr/bin/sh \n%s %s" %(commande,nom_fichier)
+          pid = os.system(script)
+      
+  def supprimer(self):
+      """ Suppression du noeud courant """
+      if self.parent.modified == 'n' : self.parent.init_modif()
+      pere = self.node.parent
+      self.node.delete()
+      pere.select()
+      
+  def affiche(self):
+      """ Force l'affichage des fenêtres en cours """
+      self.tkraise()
+
+  def selectMC(self,name):
+      """ On retrouve le mot-clé sous le curseur pour affichage du fr """
+      cmd=self.node.item.get_definition()
+      texte_infos = ''
+      for e in cmd.entites.keys() :
+          if e == name :
+              texte_infos=getattr(cmd.entites[e],'fr')
+              break
+      if texte_infos == '' : texte_infos="Pas d'infos disponibles"
+      self.parent.appli.affiche_infos(texte_infos)
+
+  def defMC(self,name):
+      """ On ajoute un mot-clé à la commande : subnode """
+      if name == SEPARATEUR:return
+      if self.parent.modified == 'n' : self.parent.init_modif()
+      if name != "COMMENTAIRE":
+          self.node.append_child(name)
+      else :
+          self.ajout_commentaire()    
+
+  def selectFilsCmd(self,name):
+      pass
+          
+  def defFilsCmd(self,name):
+      pass
+    
+  def defCmdFirst(self,name):
+      """ On ajoute une commande ou un commentaire au début du fichier de commandes """
+      if name == SEPARATEUR:return
+      if self.parent.modified == 'n' : self.parent.init_modif()
+      if name != "COMMENTAIRE":
+          new_node = self.node.append_child(name,'first')
+      else :
+          new_node = self.ajout_commentaire_first()
+
+  def add_commande_avant(self,event=None):
+    pass
+
+  def add_commande_apres(self,event=None):
+    pass          
+        
+class OngletPanel(Panel) :
+  """ Cette classe est virtuelle et doit être dérivée
+      Elle contient les principales méthodes d'affichage des différents onglets"""
+
+  def raisecmd(self,page):
+      self.nb.page(page).focus_set()
+      if page == 'Concept': self._any.focus()
+
+  def affiche(self):
+      page=self.nb.getcurselection()
+      self.nb.page(page).focus_set()
+      if page == 'Concept':self._any.component('entry').focus_set()
+      self.tkraise()
+
+  def makeConceptPage(self,page):
+      """ Crée la page de saisie du nom du concept """
+      self.label = Label(page,text='Nom du concept :')
+      self.label.place(relx=0.1,rely=0.4)
+      self._any = Entry(page,relief='sunken')
+      self._any.place(relx=0.35,rely=0.4,relwidth=0.5)
+      self._any.bind("<Return>",lambda e,s=self:s.execConcept())
+      self._any.bind("<KP_Enter>",lambda e,s=self:s.execConcept())
+      self._any.insert(0,self.node.item.GetText())
+      type_sd = self.node.item.object.get_type_sd_prod()
+      if type_sd :
+          txt = "L'opérateur courant retourne un objet de type %s" %type_sd
+          self.label = Label(page, text = txt)
+          self.label.place(relx=0.5,rely=0.55,anchor='n')
+      self._any.focus()
+          
+  def makeCommandePage(self,page):
+      """ Affiche la page d'ajout d'une commande relativement à l'objet commande sélectionné """
+      titre = "Où voulez-vous insérer une commande par rapport à %s" %self.node.item.object.nom
+      Label(page,text=titre).place(relx=0.5,rely=0.2,anchor='w')
+      b_avant = Button(page,text='AVANT',
+                       command = self.node.item.add_commande_avant)
+      b_apres = Button(page,text='APRES',
+                       command = self.node.item.add_commande_apres)
+      b_avant.place(relx=0.35,rely=0.5,anchor='w')
+      b_apres.place(relx=0.65,rely=0.5,anchor='w')
+
+  def deselectMC(self,name):
+      self.parent.appli.affiche_infos('')
+    
+  def get_liste_cmd(self):
+      listeCmd = self.node.item.object.niveau.definition.get_liste_cmd()
+      return listeCmd
+
+  def get_liste_fils_cmd(self):
+      return ['Mot-clé simple','Mot-clé facteur','Bloc']
+
+  def makeMoclesPage(self,page):
+      frame1 = Frame(page,height = 20)
+      frame1.pack(side='top',fill='x')
+      label = Label(frame1,text ="Le mot-clé choisi sera ajouté à la fin du catalogue")
+      label.pack(side='top')
+      frame2 = Frame(page)
+      frame2.pack(side='top',fill='both',expand=1)
+      liste_cmd = self.get_liste_fils_cmd()
+      liste_commandes = (("<Enter>",self.selectFilsCmd),
+                         ("<Leave>",self.deselectFilsCmd),
+                         ("<Double-Button-1>",self.defFilsCmd))
+      Liste = ListeChoix(self,frame2,liste_cmd,liste_commandes = liste_commandes,titre = "Mots-clés")
+      Liste.affiche_liste()
+
+  def deselectFilsCmd(self,name):
+      pass
+    
+  def makeJDCPage(self,page):
+      liste_cmd = self.get_liste_cmd()
+      liste_commandes = (("<Enter>",self.selectCmd),
+                         ("<Leave>",self.deselectCmd),
+                         ("<Double-Button-1>",self.defCmdFirst))
+      Liste = ListeChoix(self,page,liste_cmd,liste_commandes = liste_commandes,filtre='oui',titre = "Commandes")
+      Liste.affiche_liste()
+
+  def makeReglesPage(self,page) :
+    regles = []
+    regles = self.node.item.get_regles()
+    dictionnaire = self.node.item.get_mc_presents()
+    texte_regles = []
+    l_regles_en_defaut=[]
+    if len(regles) > 0:
+      i = 0
+      for regle in regles :
+        texte_regles.append(regle.gettext())
+        texte,test = regle.verif(dictionnaire)
+        if test == 0 : l_regles_en_defaut.append(i)
+        i = i+1
+    Liste = ListeChoix(self,page,texte_regles,liste_marques=l_regles_en_defaut,active='non',titre="Règles")
+    Liste.affiche_liste()
+    #self.afficheListe(page,texte_regles,self.selectRegle,self.execRegle)
+
+  def execConcept(self):
+      """ Nomme le concept SD retourné par l'étape """
+      if self.parent.modified == 'n' : self.parent.init_modif()
+      nom = self._any.get()
+      # Pourquoi node.etape ???
+      #test,mess = self.node.etape.item.nomme_sd(nom)
+      test,mess = self.node.item.nomme_sd(nom)
+      self.parent.appli.affiche_infos(mess)
+      self.node.racine.update()
+  
+  def changed(self):
+      pass
+
+  def makeAttributsPage(self,page):
+    l_attributs=self.node.item.object.attributs
+    d_defauts = self.node.item.object.attributs_defauts
+    for attribut in l_attributs :
+      attr = self.node.item.object.entites_attributs.get(attribut,None)
+      if attr.valeur is d_defauts[attribut] :
+        texte = attribut+' = '+repr(attr.valeur)+' (defaut)'
+      else:
+        texte = attribut+' = '+repr(attr.valeur)
+      Label(page,text=texte).pack(side='top')
+
+  def makeSimpPage(self,page):
+    texte = "Où voulez-vous ajouter un mot-clé simple ?"
+    Label(page,text=texte).place(relx=0.5,rely=0.3,anchor='center')
+    b1 = Button(page,text='AVANT '+self.node.item.object.nom,command=self.add_simp_avant)
+    b2 = Button(page,text='APRES '+self.node.item.object.nom,command=self.add_simp_apres)
+    b1.place(relx=0.5,rely=0.5,anchor='center')
+    b2.place(relx=0.5,rely=0.6,anchor='center')
+
+  def add_simp_avant(self,event=None):
+    """
+    Ajoute un mot-clé simple avant celui courant
+    """
+    self.node.append_brother('new_simp','before')
+    self.node.update()
+
+  def add_simp_apres(self,event=None):
+    """
+    Ajoute un mot-clé simple après celui courant
+    """
+    self.node.append_brother('new_simp','after')
+    self.node.update()    
+    
+class TYPEPanel(Frame):
+  def __init__(self,parent,panneau,node) :
+      self.parent=parent
+      self.panneau = panneau
+      self.node=node
+      Frame.__init__(self,self.panneau)
+      self.place(x=0,y=0,relheight=1,relwidth=1)
+      self.creer_texte()
+
+  def creer_texte(self):
+      texte = "Le noeud sélectionné correspond à un type\n"
+      self.label = Label(self,text=texte)
+      self.label.place(relx=0.5,rely=0.4,relwidth=0.8,anchor='center')
+
+class OPERPanel(OngletPanel):
+  def init(self):
+    nb = Pmw.NoteBook(self,raisecommand=self.raisecmd)
+    
+    nb.pack(fill = 'both', expand = 1)
+    self.nb=nb
+    nb.add('Mocles', tab_text='Ajouter mots-clés')
+    nb.add('Commandes',tab_text='Ajouter une commande')
+    self.makeMoclesPage(nb.page("Mocles"))
+    self.makeCommandePage(nb.page("Commandes"))
+    nb.tab('Mocles').focus_set()
+    nb.setnaturalsize()
+    self.affiche()
+
+class SIMPPanel(OngletPanel):
+  def init(self):
+    nb = Pmw.NoteBook(self,raisecommand=self.raisecmd)
+    nb.pack(fill = 'both', expand = 1)
+    self.nb=nb
+    nb.add('generaux', tab_text='Données générales')
+    nb.add('ihm',tab_text='Données IHM')
+    nb.add('mocle',tab_text='Ajouter un mot-cle simple')
+    self.makeAttributsGenerauxPage(nb.page("generaux"))
+    self.makeAttributsIHMPage(nb.page("ihm"))
+    self.makeSimpPage(nb.page('mocle'))
+    nb.tab('generaux').focus_set()
+    nb.setnaturalsize()
+    self.affiche()
+
+  def makeAttributsGenerauxPage(self,page):
+    fr1 = Frame(page,bd=1,relief='raised')
+    fr2 = Frame(page,bd=1,relief='raised')
+    fr3 = Frame(page,bd=1,relief='raised')
+    fr4 = Frame(page,bd=1,relief='raised')
+    fr5 = Frame(page,bd=1,relief='raised')
+    fr1.place(relheight=0.14,relwidth=1,rely=0)
+    fr2.place(relheight=0.14,relwidth=1,rely=0.14)
+    fr3.place(relheight=0.29,relwidth=1,rely=0.28)
+    fr4.place(relheight=0.14,relwidth=1,rely=0.57)
+    fr5.place(relheight=0.28,relwidth=1,rely=0.71)
+    # nom du mot-clé
+    Label(fr1,text = 'Nom :').place(relx=0.05,rely=0.3,anchor='w')
+    self.e_nom = Entry(fr1)
+    self.e_nom.place(relx=0.35,rely=0.3,relwidth=0.3,anchor='w')
+    self.e_nom.bind("<Return>",lambda e,s=self : s.set_valeur_attribut('nom',None))
+    self.e_nom.bind("<KP_Enter>",lambda e,s=self : s.set_valeur_attribut('nom',None))
+    self.e_nom.insert(0,self.get_valeur_attribut('nom'))
+    # Statut
+    Label(fr1,text='Statut : ').place(relx=0.05,rely=0.7,anchor='w')
+    self.statut=StringVar()
+    valeurs_statut=[('obligatoire','o'),
+                    ('facultatif','f'),
+                    ('caché','c')
+                    ]
+    self.statut.set(self.node.item.object.get_valeur_attribut('statut'))
+    i=0
+    for text,mode in valeurs_statut:
+      b=Radiobutton(fr1,text=text,variable=self.statut,value=mode,
+                    command = lambda s=self,m=mode : s.set_valeur_attribut('statut',m))
+      b.place(relx=0.25+i*0.25,rely=0.7,anchor='w')
+      i=i+1
+    # Type ...
+    Label(fr2,text='Type de la valeur : ').place(relx=0.05,rely=0.5,anchor='w')
+    self.e_type = Entry(fr2)
+    self.e_type.place(relx=0.35,rely=0.5,relwidth=0.5,anchor='w')
+    self.e_type.insert(0,self.node.item.object.get_valeur_attribut('type'))
+    # Domaine de validité
+    Label(fr3,text='Domaine de validité : ').place(relx=0.05,rely=0.2,anchor='w')
+    self.domaine = StringVar()
+    self.domaine.set(self.node.item.object.get_valeur_attribut('domaine_validité'))
+    b1=Radiobutton(fr3,text='continu',variable=self.domaine,value='continu',
+                   command=lambda s=self,f=fr3 :s.change_domaine(f))
+    b2=Radiobutton(fr3,text='discret',variable=self.domaine,value='discret',
+                   command=lambda s=self,f=fr3 :s.change_domaine(f))
+    b1.place(relx=0.35,rely=0.2,anchor='w')
+    b2.place(relx=0.65,rely=0.2,anchor='w')
+    self.change_domaine(fr3)
+    # Défaut ...
+    if self.domaine.get() == 'continu':
+      # le développeur peut donner la valeur qu'il souhaite, moyennant la vérification de type...
+      Label(fr4,text='Valeur par défaut : ').place(relx=0.05,rely=0.5,anchor='w')
+      self.e_defaut = Entry(fr4)
+      self.e_defaut.place(relx=0.35,rely=0.5,relwidth=0.5,anchor='w')
+      if self.node.item.object.get_valeur_attribut('defaut') :
+        self.e_defaut.insert(0,self.node.item.object.get_valeur_attribut('defaut'))
+      self.e_defaut.bind("<Return>",lambda e,s=self : s.set_valeur_attribut('defaut',None))
+      self.e_defaut.bind("<KP_Enter>",lambda e,s=self : s.set_valeur_attribut('defaut',None))
+    else :
+      # dans le cas discret, la valeur par défaut doit être dans l'ensemble des valeurs possibles (into)
+      liste = self.node.item.object.get_valeur_attribut('into')
+      if self.node.item.object.get_valeur_attribut('defaut') :
+        self.set_valeur_attribut('defaut',self.node.item.object.get_valeur_attribut('defaut'))
+      if liste == None : liste = []
+      self.e_defaut = Pmw.OptionMenu(fr4,labelpos='w',label_text = "Valeur par défaut : ",
+                                     items = self.node.item.object.get_valeur_attribut('into'),
+                                     menubutton_width=30)
+      self.e_defaut.configure(command = lambda e,s=self : s.set_valeur_attribut('defaut',None))
+      self.e_defaut.place(relx=0.05,rely=0.5,anchor='w')
+    # Liste de valeurs ?
+    Label(fr5,text='Liste de valeurs : ').place(relx=0.05,rely=0.2,anchor='w')
+    self.liste_valeurs = BooleanVar()
+    liste_valeurs = [('OUI',1),('NON',0)]
+    self.liste_valeurs.set(0)
+    i=0
+    for text,mode in liste_valeurs:
+      b=Radiobutton(fr5,text=text,variable=self.liste_valeurs,value=mode,
+                    command=lambda s=self,f=fr5 :s.change_liste_valeurs(f))
+      b.place(relx=0.35+i*0.2,rely=0.2,anchor='w')
+      i=i+1
+    self.change_liste_valeurs(fr5)
+
+  def makeAttributsIHMPage(self,page):
+    fr1 = Frame(page,height=100,bd=1,relief='raised')
+    fr2 = Frame(page,height=50,bd=1,relief='raised')
+    fr1.pack(side='top',fill='x')
+    fr2.pack(side='top',fill='x')
+    # Champ fr ...
+    Label(fr1,text='Champ fr : ').place(relx=0.05,rely=0.35,anchor='w')
+    self.e_fr = Entry(fr1)
+    self.e_fr.place(relx=0.35,rely=0.35,relwidth=0.6,anchor='w')
+    self.e_fr.insert(0,self.node.item.object.get_valeur_attribut('fr'))
+    # Champ ang ...
+    Label(fr1,text='Champ ang : ').place(relx=0.05,rely=0.70,anchor='w')
+    self.e_ang = Entry(fr1)
+    self.e_ang.place(relx=0.35,rely=0.70,relwidth=0.6,anchor='w')
+    self.e_ang.insert(0,self.node.item.object.get_valeur_attribut('ang'))
+    # Clé documentaire ...
+    Label(fr2,text='Clé documentaire : ').place(relx=0.05,rely=0.50,anchor='w')
+    self.e_docu = Entry(fr2)
+    self.e_docu.place(relx=0.35,rely=0.50,relwidth=0.6,anchor='w')
+    self.e_docu.insert(0,self.node.item.object.get_valeur_attribut('docu'))
+    
+  def detruit_widgets(self,l_widgets):
+    for nom_widg in l_widgets :
+      try:
+        widg = getattr(self,nom_widg)
+        widg.place_forget()
+        delattr(self,nom_widg)
+      except:
+        pass
+
+  def change_liste_valeurs(self,fr5):
+    valeur = self.liste_valeurs.get()
+    if valeur == 0 :
+      # pas de liste de valeurs
+      l_widgets=['l_homo','b1_homo','b2_homo','l_min','e_min','l_max','e_max']
+      self.detruit_widgets(l_widgets)
+    elif valeur == 1:
+      # pas de widgets à détruire ...
+      if hasattr(self,'l_homo') :
+        # on est déjà en mode 'liste' --> rien à faire
+        return 
+      # homo
+      self.l_homo = Label(fr5,text='Liste homogène : ')
+      self.l_homo.place(relx=0.05,rely=0.4,anchor='w')
+      self.homo = BooleanVar()
+      self.homo.set(self.node.item.object.get_valeur_attribut('homo'))
+      self.b1_homo=Radiobutton(fr5,text='OUI',variable=self.homo,value=1)
+      self.b2_homo=Radiobutton(fr5,text='NON',variable=self.homo,value=0)
+      self.b1_homo.place(relx=0.35,rely=0.4,anchor='w')
+      self.b2_homo.place(relx=0.65,rely=0.4,anchor='w')
+      # min ...
+      self.l_min = Label(fr5,text='Longueur minimale : ')
+      self.l_min.place(relx=0.05,rely=0.6,anchor='w')
+      self.e_min = Entry(fr5)
+      self.e_min.place(relx=0.4,rely=0.6,relwidth=0.3,anchor='w')
+      self.e_min.insert(0,self.node.item.object.get_valeur_attribut('min'))
+      # max ...
+      self.l_max = Label(fr5,text='Longueur maximale : ')
+      self.l_max.place(relx=0.05,rely=0.8,anchor='w')
+      self.e_max = Entry(fr5)
+      self.e_max.place(relx=0.4,rely=0.8,relwidth=0.3,anchor='w')
+      self.e_max.insert(0,self.node.item.object.get_valeur_attribut('max'))
+      
+  def change_domaine(self,fr3):
+    valeur = self.domaine.get()
+    if valeur == 'discret' :
+      l_widgets = ['l_val_min','l_val_max','e_val_min','e_val_max']
+      self.detruit_widgets(l_widgets)
+      # into
+      #self.l_into = Label(fr3,text='Ensemble de valeurs : ')
+      #self.l_into.place(relx=0.2,rely=0.5,anchor='w')
+      self.e_into = Pmw.ScrolledListBox(fr3,
+                                        items=self.node.item.object.get_valeur_attribut('into'),
+                                        labelpos='w',
+                                        label_text= 'Ensemble de valeurs : ',
+                                        listbox_height = 3,
+                                        dblclickcommand = self.change_into)
+      self.e_into.place(relx=0.05,rely=0.6,relwidth=0.9,anchor='w')
+      #self.e_into.insert(0,self.node.item.object.get_valeur_attribut('into'))
+    elif valeur == 'continu':
+      l_widgets = ['l_into','e_into']
+      self.detruit_widgets(l_widgets)
+      if hasattr(self,'l_val_min'):
+        # on est déjà en mode 'continu' --> rien à faire
+        return
+      # val_min
+      self.l_val_min = Label(fr3,text='Valeur minimale : ')
+      self.l_val_min.place(relx=0.05,rely=0.5,anchor='w')
+      self.e_val_min = Entry(fr3)
+      self.e_val_min.place(relx=0.35,rely=0.5,relwidth=0.5,anchor='w')
+      self.e_val_min.bind("<Return>",lambda e,s=self : s.set_valeur_attribut('val_min',None))
+      self.e_val_min.bind("<KP_Enter>",lambda e,s=self : s.set_valeur_attribut('val_min',None))
+      self.set_valeur_attribut('val_min',self.get_valeur_attribut('val_min'))
+      # val_max
+      self.l_val_max = Label(fr3,text='Valeur maximale : ')
+      self.l_val_max.place(relx=0.05,rely=0.8,anchor='w')
+      self.e_val_max = Entry(fr3)
+      self.e_val_max.place(relx=0.35,rely=0.8,relwidth=0.5,anchor='w')
+      self.e_val_max.bind("<Return>",lambda e,s=self : s.set_valeur_attribut('val_max',None))
+      self.e_val_max.bind("<KP_Enter>",lambda e,s=self : s.set_valeur_attribut('val_max',None))
+      self.set_valeur_attribut('val_max',self.get_valeur_attribut('val_max'))
+
+# ------------------------------------------------------------------
+# Méthodes de validation des entrées faites par l'utilisateur
+# ------------------------------------------------------------------
+
+  def get_valeur_attribut(self,nom_attr):
+    """
+    Demande à l'item de retourner la valeur de l'attribut nom_attr
+    """
+    return self.node.item.get_valeur_attribut(nom_attr)
+  
+  def set_valeur_attribut(self,nom_attr,new_valeur):
+    """
+    Affecte la valeur new_valeur à l'attribut nom_attr
+    Vérifie si celle-ci est valide, sinon restaure l'ancienne
+    """
+    if new_valeur is None :
+      widget = getattr(self,'e_'+nom_attr)
+      if hasattr(widget,'getcurselection'):
+        new_valeur = widget.getcurselection()
+      else:
+        new_valeur = widget.get()
+    print "on affecte %s a %s" %(str(new_valeur),nom_attr)
+    self.node.item.set_valeur_attribut(nom_attr,new_valeur)
+    self.node.update()
+
+  def change_into(self):
+    """
+    Méthode activée par double clic sur la ListBox d'affichage des valeurs discrètes possibles :
+    permet de changer la liste de ces valeurs
+    """
+    showinfo("Fonction non encore disponible",
+             "Vous ne pouvez pas encore modifier la liste into par cette IHM")
+    
+class OBJECTItem(TreeItem):
+  def __init__(self,appli,labeltext,object,setfunction=None,objet_cata_ordonne = None):
+    self.appli = appli
+    self.labeltext = labeltext
+    self.object=object
+    self.setfunction = setfunction
+    self.objet_cata_ordonne = objet_cata_ordonne
+    
+  def GetLabelText(self):
+    return self.labeltext,None,None
+
+  def get_fr(self):
+    return ''
+  
+  def isMCList(self):
+    return 0
+
+  def isactif(self):
+    return 1
+
+  def add_commande_avant(self):
+    pass
+
+  def add_commande_apres(self):
+    pass
+
+  def set_valeur_attribut(self,nom_attr,new_valeur):
+    """
+    Affecte la valeur new_valeur à l'attribut nom_attr
+    Vérifie si celle-ci est valide, sinon restaure l'ancienne
+    """
+    old_valeur = self.object.get_valeur_attribut(nom_attr)
+    self.object.set_valeur_attribut(nom_attr,new_valeur)
+    verificateur = 'verif_'+nom_attr
+    if hasattr(self.object,verificateur):
+      if not getattr(self.object,verificateur)():
+        # la nouvelle valeur de nom_attr n'est pas valide : on restaure l'ancienne (sans vérification)
+        self.object.set_valeur_attribut(nom_attr,old_valeur)
+        print 'changement de valeur refuse'
+        return
+    print 'changement de valeur accepte'
+    self.object.init_modif()
+
+  def get_valeur_attribut(self,nom_attr):
+    """
+    Retourne la valeur de l'attribut nom_attr
+    """
+    return self.object.get_valeur_attribut(nom_attr)
+        
+class CATAItem(OBJECTItem):
+  def GetSubList(self):
+    sublist=[]
+    for fils in self.object.entites_fils:
+      item = make_objecttreeitem(self.appli,fils.objet.label + " : ",fils,objet_cata_ordonne=self.objet_cata_ordonne)
+      sublist.append(item)
+    return sublist
+  
+  def GetIconName(self):
+    if self.object.isvalid():
+      return 'ast-green-square'
+    else:
+      return 'ast-red-square'
+
+  def GetText(self):
+    return "Catalogue %s" %self.appli.code
+
+  def add_commande_avant(self):
+    pass
+
+  def add_commande_apres(self):
+    pass
+
+     
+def transforme_liste_dico(liste):
+  d={}
+  for item in liste :
+    d[item.nom]=item
+  return d
+      
+class OPERItem(OBJECTItem):
+  panel = OPERPanel
+  def GetSubList(self):
+    sublist=[]
+    # on classe les fils dans l'ordre du catalogue ...
+    l_cles_fils = self.get_liste_mc_ordonnee()
+    # on crée les items fils ...
+    dico_fils = transforme_liste_dico(self.object.entites_fils)
+    for k in l_cles_fils :
+      typ = TYPE_COMPLET(dico_fils[k])
+      if type(self.objet_cata_ordonne) == types.InstanceType :
+        objet_cata = self.objet_cata_ordonne.entites[k]
+      else :
+        objet_cata = self.objet_cata_ordonne.get(k,None)
+      item = make_objecttreeitem(self.appli,typ + " : ",dico_fils[k],objet_cata_ordonne = objet_cata)
+      sublist.append(item)
+    return sublist
+
+  def GetText(self):
+    #return self.object.nom
+    return self.object.get_valeur_attribut('nom')
+
+  def get_liste_mc_ordonnee(self):
+    return self.objet_cata_ordonne.ordre_mc
+
+  def GetIconName(self):
+    if self.object.isvalid():
+      return 'ast-green-square'
+    else:
+      return 'ast-red-square'
+
+  def additem(self,name,pos):
+      if isinstance(name,TreeItem) :
+          cmd=self.object.addentite(name.getObject(),pos)
+      else :
+          cmd = self.object.addentite(name,pos)
+      typ = TYPE_COMPLET(cmd)
+      item = make_objecttreeitem(self.appli,typ + " : ", cmd)
+      return item
+
+  def get_attribut(self,nom):
+    if nom == 'nature': return 'OPERATEUR'
+
+  def get_liste_mc_presents(self):
+    return []
+
+  def verif_condition_regles(self,liste):
+    return []
+  
+class PROCItem(OPERItem):
+  panel = OPERPanel
+  
+class MACROItem(OPERItem):
+  panel = OPERPanel
+    
+class SIMPItem(OPERItem):
+  panel = SIMPPanel
+  
+  def GetIconName(self):
+    if self.object.isvalid():
+      return 'ast-green-ball'
+    else:
+      return 'ast-red-ball'
+
+  def IsExpandable(self):
+    return 0
+
+  def GetSubList(self):
+    return []
+  
+class FACTItem(OPERItem):
+  def GetIconName(self):
+    if self.object.isvalid():
+      return 'ast-green-los'
+    else:
+      return 'ast-red-los'
+
+class BLOCItem(FACTItem): pass
+
+class TYPEItem(SIMPItem):
+  panel = TYPEPanel
+  def get_dico_attributs(self):
+    self.d_attributs = {}
+
+  def GetSubList(self):
+    return []
+
+  def IsExpandable(self):
+    return 0
+
+  def GetText(self):
+    return self.object.nom
+
+class NIVEAUItem(OPERItem):
+  def IsExpandable(self):
+      return 1
+
+  def get_liste_mc_ordonnee(self):
+    l=[]
+    for fils in self.object.entites_fils:
+      l.append(fils.nom)
+    return l
+  
+  def GetSubList(self):
+    sublist=[]
+    # on classe les fils dans l'ordre du catalogue ...
+    l_cles_fils = self.get_liste_mc_ordonnee()
+    # on crꥠles items fils ...
+    dico_fils = transforme_liste_dico(self.object.entites_fils)
+    for k in l_cles_fils :
+      typ = TYPE_COMPLET(dico_fils[k])
+      if type(self.objet_cata_ordonne) == types.InstanceType :
+        objet_cata = self.objet_cata_ordonne.entites[k]
+      else :
+        objet_cata = self.objet_cata_ordonne.get(k,None)
+      item = make_objecttreeitem(self.appli,typ + " : ",dico_fils[k],objet_cata_ordonne = objet_cata)
+      sublist.append(item)
+    return sublist
+  
+  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 self.labeltext,Fonte_Niveau,'#00008b'
+    
+  def GetIconName(self):
+    if self.object.isvalid():
+      return "ast-green-text"
+    else:
+      return 'ast-red-text'
+
+  def additem(self,name,pos):
+      if isinstance(name,TreeItem) :
+          cmd=self.object.addentite(name.getObject(),pos)
+      else :
+          cmd = self.object.addentite(name,pos)
+      typ = TYPE_COMPLET(obj)
+      item = make_objecttreeitem(self.appli,typ+ " : ", cmd)
+      return item
+
+  def suppitem(self,item) :
+    # item = item de l'ETAPE à supprimer du JDC
+    # item.getObject() = ETAPE ou _C
+    # self.object = JDC
+    itemobject=item.getObject()
+    if self.object.suppentite(itemobject):
+       if isinstance(itemobject,_C):
+          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 ''
+    
+class ATTRIBUTItem(SIMPItem):
+  def get_dico_attributs(self):
+    self.d_attributs = {}
+
+  def GetSubList(self):
+    return []
+
+  def IsExpandable(self):
+    return 0
+
+  def GetText(self):
+    return self.object
+
+  def GetIconName(self):
+    return 'aucune' 
+
+class CataEditeur:
+  def __init__(self,parent,appli,cata):
+    self.parent = parent
+    self.cata = definition_cata.CATALOGUE(cata)
+    self.appli = appli
+    self.top = Toplevel()
+    self.top.geometry("800x500")
+    self.top.title("Edition d'un catalogue")
+    self.init()
+
+  def close(self):
+    self.top.destroy()
+
+  def init(self):
+    self.nodes={}
+    self.creerbarremenus()
+    self.pane = Pmw.PanedWidget(self.top,
+                                hull_width = 800,
+                                hull_height = 500,
+                                orient = 'horizontal')
+    self.pane.add('canvas',min = 0.4, max = 0.6, size = 0.45)
+    self.pane.add('panel',min = 0.4, max = 0.6, size = 0.55)
+    self.pane.pack(expand =1, fill = 'both')
+    self.scrolledcanvas = Pmw.ScrolledCanvas(self.pane.pane('canvas'),
+                                             hull_width=1.,
+                                             hull_height=1.,
+                                             borderframe=1)
+    Pmw.Color.changecolor(self.scrolledcanvas.component('canvas'),background='gray95')
+    self.scrolledcanvas.pack(padx=10,pady=10,expand=1, fill="both")
+    self.item = CATAItem(self.appli,"Catalogue",
+                           self.cata,
+                          objet_cata_ordonne = self.appli.readercata.cata_ordonne_dico)
+
+    self.tree = Tree(self.appli,self.item,self.scrolledcanvas,command = self.select_node)
+    self.tree.draw()
+    self.node = self.tree.node_selected
+
+  def creerbarremenus(self) :
+      self.menubar=Menu(self.top)
+      self.filemenu=Menu(self.menubar,tearoff=0)
+      self.filemenu.add_command(label='Quitter',command=self.quit)
+
+      self.editmenu=Menu(self.menubar,tearoff=0)
+      #self.editmenu.add_command(label='Copier',command=self.copy)
+      #self.editmenu.add_command(label='Couper',command=self.cut)
+      #self.editmenu.add_command(label='Coller',command=self.paste)
+
+      self.affichagemenu=Menu(self.menubar,tearoff=0)
+      self.affichagemenu.add_command(label='Rapport de validation',
+                                     command = self.visuCR)
+      self.affichagemenu.add_command(label='shell',command = self.shell)
+      #self.affichagemenu.add_command(label='Fichier ࡰlat',command=self.visu_a_plat)
+      #self.affichagemenu.add_command(label='Fichier .py',command =self.visuJDC_py)
+      #self.affichagemenu.add_command(label='Fichier source',command = self.visu_txt_brut_JDC)
+      #self.affichagemenu.add_command(label='Param鵲es Eficas',command=self.affichage_fichier_ini)
+      
+      #self.optionmenu=Menu(self.menubar,tearoff=0)
+      #self.optionmenu.add_command(label='Catalogue d귥loppeur',command=self.choix_cata_developpeur)
+
+      self.menubar.add_cascade(label='Fichier',menu=self.filemenu)
+      self.menubar.add_cascade(label='Edition',menu=self.editmenu)
+      self.menubar.add_cascade(label='Jeu de commandes',menu=self.affichagemenu)
+      #self.menubar.add_cascade(label='Browsers',menu=self.browsermenu)
+      #self.menubar.add_cascade(label='Catalogue',menu=self.cataloguemenu)
+      #self.menubar.add_cascade(label='Options',menu=self.optionmenu)
+      self.top.configure(menu=self.menubar)
+      self.top.protocol("WM_DELETE_WINDOW",self.quit)
+      self.top.minsize(900,500)
+      self.top.geometry("900x500")
+
+  def shell(self,event=None):
+      import Interp
+      d={'j':self.tree.item.getObject()}
+      Interp.InterpWindow(d,parent=self.parent)
+      
+  def visuCR(self,mode='Cata'):
+    txt = str(self.cata.report())
+    titre="Rapport de validation du catalogue"
+    Fenetre(self.appli,titre=titre,texte=txt)
+  
+  def select_node(self,node):
+    self.nodes[node]=self.create_panel(node)
+
+  def create_panel(self,node):
+    if hasattr(node.item,"panel"):
+      return getattr(node.item,"panel")(self,self.pane.pane('panel'),node)
+      
+  def quit(self) :
+    self.top.destroy()
+    
+  def settitle(self):
+    self.top.wm_title("Browser de catalogue " )
+    self.top.wm_iconname("CataBrowser")
+
+dispatch = {
+    'OPER'   : OPERItem,
+    'PROC'   : PROCItem,
+    'MACRO'  : MACROItem,
+    'SIMP'   : SIMPItem,
+    'FACT'   : FACTItem,
+    'BLOC'   : BLOCItem,
+    'TYPE'   : TYPEItem,
+    'NIVEAU' : NIVEAUItem
+}
+
+def TYPE(o):
+  if isinstance(o,definition_cata.OPER_CATA):return 'OPER'
+  elif isinstance(o,definition_cata.PROC_CATA):return 'PROC'
+  elif isinstance(o,definition_cata.MACRO_CATA):return 'MACRO'
+  elif isinstance(o,definition_cata.SIMP_CATA):return 'SIMP'
+  elif isinstance(o,definition_cata.FACT_CATA):return 'FACT'
+  elif isinstance(o,definition_cata.BLOC_CATA):return 'BLOC'
+  elif isinstance(o,definition_cata.TYPE_CATA):return 'TYPE'
+  elif isinstance(o,definition_cata.NIVEAU_CATA) : return 'NIVEAU'
+  else:return type(o)
+
+def TYPE_COMPLET(o):
+  if isinstance(o,definition_cata.OPER_CATA):return "OPERATEUR"
+  elif isinstance(o,definition_cata.PROC_CATA):return "PROCEDURE"
+  elif isinstance(o,definition_cata.MACRO_CATA):return "MACRO"
+  elif isinstance(o,definition_cata.SIMP_CATA):return "Mot-clé SIMPLE"
+  elif isinstance(o,definition_cata.FACT_CATA):return "Mot-clé FACTEUR"
+  elif isinstance(o,definition_cata.BLOC_CATA):return "BLOC"
+  elif isinstance(o,definition_cata.TYPE_CATA):return "Type"
+  elif isinstance(o,definition_cata.NIVEAU_CATA):return "Niveau"
+  else: return "Inconnu ("+`type(o)`+")"
+  
+def make_objecttreeitem(appli,labeltext, object, setfunction=None,objet_cata_ordonne=None):
+    t = TYPE(object)
+    if dispatch.has_key(t):
+      c = dispatch[t]
+    else:
+      print 'on a un objet de type :',type(object),'  ',object
+      c = ATTRIBUTItem
+    return c(appli,labeltext, object, setfunction = setfunction,objet_cata_ordonne=objet_cata_ordonne)
+
+
+
diff --git a/InterfaceTK/centerwindow.py b/InterfaceTK/centerwindow.py
new file mode 100644 (file)
index 0000000..4acca2e
--- /dev/null
@@ -0,0 +1,53 @@
+# -*- 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 contient la fonction utilitaire centerwindow
+   qui sert à centrer une fenetre
+"""
+import types
+
+def centerwindow(window,parent = 'avec'):
+    if parent =='avec':
+        parent = window.winfo_parent()
+        if type(parent) == types.StringType:
+            parent = window._nametowidget(parent)
+    # Find size of window.
+    window.update_idletasks()
+    width = window.winfo_width()
+    height = window.winfo_height()
+    if width == 1 and height == 1:
+        # If the window has not yet been displayed, its size is
+        # reported as 1x1, so use requested size.
+        width = window.winfo_reqwidth()
+        height = window.winfo_reqheight()
+    # Place in centre of screen:
+    if parent =='avec' :
+        x = (window.winfo_screenwidth() - width) / 2 - parent.winfo_vrootx()
+        y = (window.winfo_screenheight() - height) / 3 - parent.winfo_vrooty()
+    else:
+        x = (window.winfo_screenwidth() - width) / 2 
+        y = (window.winfo_screenheight() - height) / 3
+    if x < 0:
+        x = 0
+    if y < 0:
+        y = 0
+    window.geometry('+%d+%d' % (x, y))
+    
diff --git a/InterfaceTK/change_comm.py b/InterfaceTK/change_comm.py
new file mode 100755 (executable)
index 0000000..a664e27
--- /dev/null
@@ -0,0 +1,167 @@
+# -*- 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 patentier l'utilisateur
+"""
+# Modules Python
+import sys
+import os
+
+# Modules Eficas
+from Editeur import import_code
+from Editeur import session
+from Aster import prefs
+import convert
+import generator
+import string
+from Editeur.utils import extension_fichier,stripPath, save_in_file
+
+class DUP :
+
+   def __init__(self,code):
+       """
+       """
+       self.format_fichier="python"
+       self.version_code=None
+       self.code=code
+
+       self.top=None
+       self.test=2
+       from Editeur import configuration
+       self.CONFIGURATION=configuration.make_config(self,prefs.REPINI)
+
+       self.load_readercata()
+       self.cata=self.readercata.cata
+
+       self.JDC=None
+       self.JDCName=""
+       self.J2=None
+
+   def load_readercata(self):
+       mname='readercata'
+       module=__import__(mname,globals(),locals())
+       factory=getattr(module,mname.upper())
+       appli_composant=factory(self,self.top)
+       setattr(self,mname,appli_composant)
+
+
+   def openJDC(self,fichier):
+      if fichier :
+          self.fichier = fichier
+          e=extension_fichier(fichier)
+          self.JDCName=stripPath(fichier)
+          self.initialdir = os.path.dirname(os.path.abspath(fichier))
+      else :
+          return
+
+      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(fichier)
+         text=p.convert('exec',self)
+         if not p.cr.estvide(): 
+            print ("Erreur à la conversion")
+            print str(p.cr)
+            return
+
+      # On se met dans le repertoire ou se trouve le fichier de commandes
+      # pour trouver les eventuels fichiers include ou autres
+      # localises a cote du fichier de commandes
+      os.chdir(self.initialdir)
+      CONTEXT.unset_current_step()
+      J=self.cata[0].JdC(procedure=text,appli=self,
+                         cata=self.cata,cata_ord_dico=self.readercata.cata_ordonne_dico,
+                         nom = self.JDCName,
+                         rep_mat=self.CONFIGURATION.rep_mat,
+                         )
+
+      J.analyse()
+
+      txt_exception = J.cr.get_mess_exception()
+      if txt_exception :
+          # des exceptions ont été levées à la création du JDC 
+          # --> on affiche les erreurs mais pas le JDC
+          self.JDC=J
+          print("Erreur fatale au chargement de %s" %file)
+      else :
+          self.JDC=J
+
+   def modifieJDC(self,texte):
+         if texte == None or texte == "" : return
+         format="python"
+         lignes=string.split(texte,";")
+         textedecoup=""
+         for l in lignes :
+            textedecoup=textedecoup+l+'\n'
+         if convert.plugins.has_key(format):
+            p=convert.plugins[format]()
+            p.settext(textedecoup)
+            text=p.convert('exec',self)
+            print text
+         if not p.cr.estvide(): 
+            print ("Erreur à la conversion")
+            print str(p.cr)
+            return
+         self.J2=self.cata[0].JdC(procedure=text,appli=self,
+                         cata=self.cata,
+                         cata_ord_dico=self.readercata.cata_ordonne_dico,
+                         nom = self.JDCName+"2",
+                         rep_mat=self.CONFIGURATION.rep_mat,
+                         )
+         self.J2.definition.code = "MODIF"
+         self.J2.analyse()
+     
+
+   def saveJDC(self,fichierSortie):
+      """ 
+          Sauvegarde le JDC courant.
+          Retourne 1 si la sauvegarde s'est bien faite, 0 sinon.
+      """
+      if not hasattr(self,'JDC') : return 0
+
+      format="Modif"
+
+      if generator.plugins.has_key(format):
+         g=generator.plugins[format]()
+         jdc_formate=g.genermodifparam(self.JDC,self.J2)
+         if not g.cr.estvide():
+            self.affiche_infos("Erreur à la generation")
+            return 0
+      else:
+         self.affiche_infos("Format %s non reconnu" % format)
+         return 0
+
+      self.jdc_fini = string.replace(jdc_formate,'\r\n','\n')
+
+      if not save_in_file(fichierSortie,self.jdc_fini) :
+         self.affiche_infos("Problème à la sauvegarde du fichier")
+         return 0
+      else :
+         self.affiche_infos("sauvegarde effectuée")
+         return 1
+
+
+   def affiche_infos(self,mess):
+       print mess
+          
diff --git a/InterfaceTK/compobase.py b/InterfaceTK/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/InterfaceTK/compobloc.py b/InterfaceTK/compobloc.py
new file mode 100644 (file)
index 0000000..e92d519
--- /dev/null
@@ -0,0 +1,42 @@
+# -*- 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 Tkinter import *
+import Pmw
+
+from Editeur import Objecttreeitem
+import compofact
+
+
+class BLOCTreeItem(compofact.FACTTreeItem):
+  panel = compofact.FACTPanel
+
+  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/InterfaceTK/compocomm.py b/InterfaceTK/compocomm.py
new file mode 100644 (file)
index 0000000..2d96384
--- /dev/null
@@ -0,0 +1,169 @@
+# -*- 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 Tkinter import *
+import Pmw
+import string
+
+from Editeur import Objecttreeitem
+import panels
+from InterfaceTK import fontes
+
+Fonte_Commentaire = fontes.standard_italique
+
+class COMMPanel(panels.OngletPanel):
+  
+  def init(self):
+    """
+    Initialise les frame des panneaux contextuels relatifs à un COMMENTAIRE
+    """
+    nb = Pmw.NoteBook(self,raisecommand=self.raisecmd)
+    nb.pack(fill = 'both', expand = 1)
+    self.nb=nb
+    nb.add('TexteComm', tab_text='Texte Commentaire')
+    nb.add('Commande', tab_text='Nouvelle Commande')
+    nb.add('Commentaire',tab_text='Paramètre/Commentaire')
+    self.makeCOMMPage(nb.page("TexteComm"))
+    self.makeCommandePage(nb.page("Commande"))
+    self.makeParamCommentPage_for_etape(nb.page("Commentaire"))
+    nb.tab('TexteComm').focus_set()
+    self.enlevebind()
+    self.creebind()
+    nb.setnaturalsize()
+    
+  def makeCOMMPage(self,page):
+    """
+    Crée la page qui permet d'afficher et d'éditer le texte du commentaire
+    """
+    self.frame_valeur = Frame(page)
+    self.frame_valeur.place(relwidth=0.9,relheight=0.9,relx=0.05,rely=0.05,anchor='nw')
+    self.widget_text = Pmw.ScrolledText(self.frame_valeur,
+                                        borderframe=1,
+                                        labelpos='n',
+                                        label_text = 'Texte du commentaire\n ')
+    self.widget_text.pack(side='top',expand=1,fill='both')
+    self.widget_text.configure(hscrollmode='dynamic',
+                               vscrollmode='dynamic')
+    self.make_buttons()
+    self.display_valeur()
+
+  def make_buttons(self):
+    """
+    Crée les boutons du panneau
+    """
+    #self.bouton_sup.place_forget()
+    #self.bouton_doc.place_forget()
+    #self.bouton_val = Button(self.fr_but,text='Valider',command=self.change_valeur,width=14)
+    #self.bouton_ann = Button(self.fr_but,text='Annuler',command=self.display_valeur,width=14)
+
+    #self.bouton_val.place(relx=0.25,rely=0.5,relheight=0.8,anchor='center')
+    #self.bouton_ann.place(relx=0.50,rely=0.5,relheight=0.8,anchor='center')
+    #self.bouton_sup.place(relx=0.75,rely=0.5,relheight=0.8,anchor='center')
+
+    self.bouton_sup.pack_forget()
+    self.bouton_doc.pack_forget()
+    self.bouton_val = Button(self.fr_but,text='Valider',command=self.change_valeur)
+    self.bouton_ann = Button(self.fr_but,text='Annuler',command=self.display_valeur)
+
+    self.bouton_val.pack(side='left',padx=5, pady=5)
+    self.bouton_ann.pack(side='left',padx=5, pady=5)
+    self.bouton_sup.pack(side='right',padx=5, pady=5)
+
+  def change_valeur(self):
+    """
+    Stocke la nouvelle valeur donnée par l'utilisateur comme valeur du commentaire
+    """
+    if self.parent.modified == 'n' : self.parent.init_modif()
+    new_valeur = self.widget_text.get()
+    self.node.item.set_valeur(new_valeur)
+    self.node.update()
+
+  def display_valeur(self):
+    """
+    Affiche dans self.widget_text la valeur de l'objet commentaire
+    (annule d'éventuelles modifications faite par l'utilisateur)
+    """
+    t=self.node.item.get_valeur()
+    try:
+        self.widget_text.settext(unicode(t))
+    except:
+        # Si probleme avec unicode
+        self.widget_text.settext(t)
+    
+class COMMTreeItem(Objecttreeitem.ObjectTreeItem):
+    panel = COMMPanel
+
+    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',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):
+      """
+      Afefcte 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( 'Citoyen : tu peux "commentariser" une commande MAIS PAS UN COMMENTAIRE' )
+  
+import Extensions
+treeitem =COMMTreeItem
+objet = Extensions.commentaire.COMMENTAIRE    
diff --git a/InterfaceTK/compocommandecomm.py b/InterfaceTK/compocommandecomm.py
new file mode 100644 (file)
index 0000000..e51705c
--- /dev/null
@@ -0,0 +1,182 @@
+# -*- 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
+from Tkinter import *
+import Pmw
+import string
+from widgets import showerror
+
+from Editeur import Objecttreeitem
+import panels
+from InterfaceTK import fontes
+
+Fonte_Commentaire = fontes.standard_italique
+
+class COMMANDE_COMMPanel(panels.OngletPanel):
+  """
+  Classe servant à définir le panel associé à une commande commentarisée
+  """
+  def init(self):
+    """
+    Initialise les frame des panneaux contextuels relatifs à une commande commentarisée
+    """
+    panneau=Frame(self)
+    panneau.pack(expand=1,fill='both')
+    self.make_buttons()
+    self.makeCOMMPage(panneau)
+    self.enlevebind()
+
+  def makeCOMMPage(self,page):
+    """
+    Crée la page qui permet d'afficher et d'éditer le texte de la commande commentarisée
+    """
+    self.frame_valeur = Frame(page)
+    self.frame_valeur.place(relwidth=0.9,relheight=0.9,relx=0.05,rely=0.05,anchor='nw')
+    self.widget_text = Pmw.ScrolledText(self.frame_valeur,
+                                        borderframe=1,
+                                        labelpos='n',
+                                        label_text = 'Texte de la commande\n ')
+    self.widget_text.pack(side='top',expand=1,fill='both')
+    self.widget_text.configure(hscrollmode='dynamic',
+                               vscrollmode='dynamic')
+    self.display_valeur()
+
+  def make_buttons(self):
+    """
+    Crée les boutons du panneau
+    """
+    #self.bouton_sup.place_forget()
+    #self.bouton_doc.place_forget()
+    #self.bouton_val = Button(self.fr_but,text='Valider',command=self.change_valeur,width=14)
+    #self.bouton_ann = Button(self.fr_but,text='Annuler',command=self.display_valeur,width=14)
+    #self.bouton_unc = Button(self.fr_but,text='Décommentariser',command=self.uncomment,width=14)
+
+    #self.bouton_val.place(relx=0.1,rely=0.5,relheight=1,relwidth=0.20,anchor='center')
+    #self.bouton_ann.place(relx=0.30,rely=0.5,relheight=1,relwidth=0.20,anchor='center')
+    #self.bouton_sup.place(relx=0.50,rely=0.5,relheight=1,relwidth=0.20,anchor='center')
+    #self.bouton_unc.place(relx=0.75,rely=0.5,relheight=1,relwidth=0.25,anchor='center')
+
+    self.bouton_sup.pack_forget()
+    self.bouton_doc.pack_forget()
+    self.bouton_val = Button(self.fr_but,text='Valider',command=self.change_valeur)
+    self.bouton_ann = Button(self.fr_but,text='Annuler',command=self.display_valeur)
+    self.bouton_unc = Button(self.fr_but,text='Décommentariser',command=self.uncomment)
+    self.bouton_val.pack(side='left',padx=5, pady=5)
+    self.bouton_ann.pack(side='left',padx=5, pady=5)
+    self.bouton_sup.pack(side='left',padx=5, pady=5)
+    self.bouton_unc.pack(side='right',padx=5, pady=5)
+
+  def change_valeur(self):
+    """
+    Stocke la nouvelle valeur donnée par l'utilisateur comme valeur de la commande commentarisée
+    """
+    if self.parent.modified == 'n' : self.parent.init_modif()
+    new_valeur = self.widget_text.get()
+    self.node.item.set_valeur(new_valeur)
+    self.node.update()
+
+  def display_valeur(self):
+    """
+    Affiche dans self.widget_text la valeur de la commande commentarisée
+    (annule d'éventuelles modifications faite par l'utilisateur)
+    """
+    self.widget_text.settext(self.node.item.get_valeur())
+
+  def uncomment(self):
+      """
+      Réalise la décommentarisation de self
+      """
+      try:
+          pos=self.node.parent.children.index(self.node)
+          commande,nom = self.node.item.uncomment()
+          self.node.parent.children[pos].select()
+      except Exception,e:
+          showerror("Erreur !",str(e))
+          return
+      #self.parent.appli.bureau.JDCDisplay_courant.ReplaceObjectNode(self.node,commande,nom)
+    
+class COMMANDE_COMMTreeItem(Objecttreeitem.ObjectTreeItem):
+    panel = COMMANDE_COMMPanel
+
+    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 'commande commentarisée',Fonte_Commentaire,None
+
+    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()
+      except Exception,e:
+        traceback.print_exc()
+        raise e
+      return commande,nom
+  
+import Accas
+treeitem =COMMANDE_COMMTreeItem
+objet = Accas.COMMANDE_COMM    
diff --git a/InterfaceTK/compoerror.py b/InterfaceTK/compoerror.py
new file mode 100644 (file)
index 0000000..74e0c46
--- /dev/null
@@ -0,0 +1,45 @@
+# -*- 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
+import panels
+
+class ERRORPanel(panels.Panel_Inactif):
+    def creer_texte(self):
+        texte = """Le noeud sélectionné correspond à un objet erroné """
+        label = Label(self,text=texte,justify='center')
+        label.place(relx=0.5,rely=0.4,relwidth=0.8,anchor='center')
+        bouton = Button(self,text = "Supprimer", command=self.supprimer)
+        bouton.place(relx=0.5,rely=0.5,anchor='center')
+
+class ERRORTreeItem(Objecttreeitem.AtomicObjectTreeItem):
+    panel = ERRORPanel
+    def GetIconName(self):
+        return "ast-red-ball"
+
+
+treeitem =ERRORTreeItem
+objet = ErrorObj
+
diff --git a/InterfaceTK/compofact.py b/InterfaceTK/compofact.py
new file mode 100644 (file)
index 0000000..0d98438
--- /dev/null
@@ -0,0 +1,150 @@
+# -*- 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 Pmw
+from Editeur import Objecttreeitem
+import panels
+
+class FACTPanel(panels.OngletPanel) :
+  def init(self) :
+    nb = Pmw.NoteBook(self,raisecommand=self.raisecmd)
+    nb.pack(fill = 'both', expand = 1) 
+    self.nb=nb
+    nb.add('Mocles', tab_text='Ajouter mots-clés')
+    panneau=Pmw.PanedWidget(nb.page("Mocles"),
+                            orient='horizontal')
+    panneau.add('left',min=0.4,max=0.6,size=0.5)
+    panneau.add('right',min=0.4,max=0.6,size=0.5)
+    panneau.pack(expand=1,fill='both')
+    self.makeMoclesPage(panneau.pane('left'))
+    self.makeReglesPage(panneau.pane('right'))
+    nb.tab('Mocles').focus_set()
+    nb.setnaturalsize()
+    self.enlevebind()
+    self.creebind()
+    self.affiche()
+
+import treewidget
+class Node(treewidget.Node):
+    def doPaste(self,node_selected):
+        objet_a_copier = self.item.get_copie_objet()
+        child=node_selected.doPaste_MCF(objet_a_copier)
+        return child
+
+    def doPaste_MCF(self,objet_a_copier):
+        child = self.parent.append_child(objet_a_copier,
+                                              pos=self.item,
+                                              retour='oui')
+        return child
+
+
+class FACTTreeItem(Objecttreeitem.ObjectTreeItem):
+  panel = FACTPanel
+  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):
+    #print "compofact.additem",name,pos
+    objet = self.object.addentite(name,pos)
+    return objet
+
+  def suppitem(self,item) :
+      """ 
+         Cette methode a pour fonction de supprimer l'item passé en argument
+         des fils de l'item FACT qui est son pere
+           - item = item du MOCLE à supprimer du MOCLE père
+           - 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/InterfaceTK/compoformule.py b/InterfaceTK/compoformule.py
new file mode 100644 (file)
index 0000000..a9a5a5f
--- /dev/null
@@ -0,0 +1,411 @@
+# -*- 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 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 modules Python
+from Tkinter import *
+import Pmw
+import string
+
+# import modules EFICAS
+import widgets
+import panels
+from InterfaceTK import fontes
+import compooper
+
+Fonte_TITRE = fontes.standard_gras_souligne
+
+
+class FORMULEPanel(panels.OngletPanel):
+  """
+  Classe servant à construire le panneau associé à un paramètre.
+  C'est au moyen de ce panneau que l'utilisateur peut accéder
+  aux nom et valeur du paramètre en vue éventuellement de les
+  modifier.
+  """
+
+  def init(self):
+    nb = Pmw.NoteBook(self,raisecommand=self.raisecmd)
+    nb.pack(fill = 'both', expand = 1)
+    self.nb=nb
+    nb.add('Formule', tab_text='Définition Formule')
+    nb.add('Commande', tab_text='Nouvelle Commande')
+    nb.add('Commentaire',tab_text='Paramètre/Commentaire')
+    self.makeFormulePage(nb.page("Formule"))
+    self.makeCommandePage(nb.page("Commande"))
+    self.makeParamCommentPage_for_etape(nb.page("Commentaire"))
+    nb.tab('Formule').focus_set()
+    self.enlevebind()
+    self.creebind()
+    nb.setnaturalsize()
+    
+  def makeFormulePage(self,page):
+    """
+    Crée la page qui permet d'afficher et d'éditer le texte de la FORMULE
+    """
+    self.frame_valeur = Frame(page)
+    self.frame_valeur.pack(fill='both',expand=1)
+    #self.frame_valeur.place(relwidth=0.95,relheight=0.95,relx=0.05,rely=0.05,anchor='nw')
+    #self.frame_valeur.place(relwidth=0.9,relheight=0.9,relx=0.05,rely=0.05,anchor='nw')
+    # affichage du titre du panneau
+    self.titre = StringVar()
+    self.titre.set("FORMULE "+self.node.item.get_nom())
+
+    self.entry_nom = Entry(self.frame_valeur)
+    #Label(self.frame_valeur,textvariable=self.titre,font=Fonte_TITRE).place(relx=0.5,rely=0.,anchor='n')
+    Label(self.frame_valeur,textvariable=self.titre,font=Fonte_TITRE).grid(row=0,columnspan=2,padx=5,pady=5)
+    # création des labels et entries associés aux nom, type retourné, arguments et corps de la FORMULE
+    
+    #Label(self.frame_valeur,text= 'Nom de la formule : ').place(relx=0.,rely=0.1)
+    Label(self.frame_valeur,text= 'Nom de la formule : ').grid(row=1,sticky=W,padx=5,pady=5)
+    #Label(self.frame_valeur,text= 'Arguments : ').place(relx=0.,rely=0.40)
+    Label(self.frame_valeur,text= 'Arguments : ').grid(row=2,sticky=W,padx=5,pady=5)
+    self.entry_arg = Entry(self.frame_valeur)
+    #Label(self.frame_valeur,text= 'Expression : ').place(relx=0.,rely=0.65)
+    Label(self.frame_valeur,text= 'Expression : ').grid(row=4,sticky=W,padx=5,pady=5)
+    self.entry_exp = Entry(self.frame_valeur)
+
+    # binding sur les entries
+    self.entry_nom.bind("<Return>",self.verif_nom)
+    self.entry_nom.bind("<KP_Enter>",self.verif_nom)
+    self.entry_arg.bind("<Return>",self.verif_arguments)
+    self.entry_arg.bind("<KP_Enter>",self.verif_arguments)
+    self.entry_exp.bind("<Return>",self.verif_corps)
+    self.entry_exp.bind("<KP_Enter>",self.verif_corps)
+    # affichage des entries
+    #self.entry_nom.place(relx=0.35,rely=0.10,relwidth=0.2)
+    self.entry_nom.grid(row=1,column=1,sticky=W,padx=5,pady=5)
+    #self.entry_arg.place(relx=0.35,rely=0.40,relwidth=0.4)
+    self.entry_arg.grid(row=2,column=1,sticky=W,padx=5,pady=5)
+
+    # affichage d'une phrase d'aide pour les arguments
+    aide = """Entrer les arguments sous la forme
+de VARIABLES séparées par des virgules (,)
+Exemple X,Y,Z """
+    #Label(self.frame_valeur,text=aide, justify="l").place(relx=0.5,rely=0.47,anchor='n') 
+    Label(self.frame_valeur,text=aide, justify="l").grid(row=3,columnspan=2,padx=5,pady=5)
+
+    #self.entry_exp.place(relx=0.35,rely=0.65,relwidth=0.60)
+    self.entry_exp.grid(row=4,column=1,sticky=W,padx=5,pady=5)
+    # affichage d'une phrase d'aide pour l'expression
+    aide = """Un retour de chariot dans une zone de saisie vous permet de vérifier si
+la valeur que vous avez entrée est valide.
+Ce n'est qu'après avoir appuyé sur le bouton Valider que les nouvelles
+valeurs seront effectivement prises en compte."""
+    #Label(self.frame_valeur,text=aide).place(relx=0.5,rely=0.75,anchor='n')
+    Label(self.frame_valeur,text=aide).grid(row=5,columnspan=2,padx=5,pady=5)
+    self.frame_valeur.columnconfigure(1,weight=1)
+
+    # affichage des nom, type retourné, arguments et corps de la FORMULE
+    self.display_valeur()
+    # affichage des boutons
+    self.make_buttons()
+    # entry_nom prend le focus
+    self.entry_nom.focus()
+
+  def make_buttons(self):
+    """
+    Crée les boutons du panneau
+    """
+    #self.bouton_sup.place_forget()
+    #self.bouton_doc.place_forget()
+    #self.bouton_val = Button(self.fr_but,text='Valider',command=self.change_valeur,width=14)
+    #self.bouton_ann = Button(self.fr_but,text='Annuler',command=self.display_valeur,width=14)
+
+    #self.bouton_val.place(relx=0.15,rely=0.5,relheight=0.8,anchor='center')
+    #self.bouton_ann.place(relx=0.40,rely=0.5,relheight=0.8,anchor='center')
+    #self.bouton_sup.place(relx=0.65,rely=0.5,relheight=0.8,anchor='center')
+    #self.bouton_doc.place(relx=0.90,rely=0.5,relheight=0.8,anchor='center')
+
+    self.bouton_sup.pack_forget()
+    self.bouton_doc.pack_forget()
+    self.bouton_val = Button(self.fr_but,text='Valider',command=self.change_valeur)
+    self.bouton_ann = Button(self.fr_but,text='Annuler',command=self.display_valeur)
+
+    self.bouton_val.pack(side='left',padx=5, pady=5)
+    self.bouton_ann.pack(side='left',padx=5, pady=5)
+    self.bouton_sup.pack(side='left',padx=5, pady=5)
+    self.bouton_doc.pack(side='right',padx=5, pady=5)
+
+  def change_valeur(self):
+    """
+    Stocke la nouvelle FORMULE décrite par l'utilisateur
+    """
+    if self.parent.modified == 'n' : self.parent.init_modif()
+    # on récupère les nouveaux nom, type retourné, arguments et corps de la FORMULE
+    new_nom = self.entry_nom.get()
+    new_typ="REEL" 
+    new_arg = self.entry_arg.get()
+    new_exp = self.entry_exp.get()
+    self.verif_arguments()
+    self.verif_corps()
+    # on essaie de les stocker
+    test,erreur = self.node.item.save_formule(new_nom,new_typ,new_arg,new_exp)
+    if test :
+        # on a pu stocker les nouveaux paramètres : il faut rafraîchir l'affichage
+        self.node.update()
+        self.display_valeur()
+        self.parent.appli.affiche_infos("FORMULE %s modifiée" %self.node.item.get_nom())
+    else:
+        # la formule est incorrecte : on affiche les erreurs
+        widgets.showerror("Formule incorrecte",erreur)
+        self.parent.appli.affiche_infos("FORMULE %s non modifiée" %self.node.item.get_nom())
+    
+  def display_valeur(self):
+    """
+    Affiche dans self.widget_text de la valeur de l'objet FORMULE
+    (annule d'éventuelles modifications faite par l'utilisateur)
+    """
+    # on efface tout texte affiché dans les entries
+    self.entry_nom.delete(0,END)
+    self.entry_arg.delete(0,END)
+    self.entry_exp.delete(0,END)
+    # on rafraîchit le titre du panneau
+    self.titre.set('FORMULE '+self.node.item.get_nom())
+    # on insére les nouveaux nom, type retourné, arguments et corps de la FORMULE
+    nom = self.node.item.get_nom()
+    if nom != '':
+        self.entry_nom.insert(END,nom)
+    args = self.node.item.get_args()
+    if args:
+        texte_args=""
+        for i in args :
+            if texte_args != "" :
+               texte_args = texte_args +","
+            texte_args=texte_args + i
+        self.entry_arg.insert(END,texte_args)
+    corps = self.node.item.get_corps()
+    if corps :
+        self.entry_exp.insert(END,self.node.item.get_corps())
+
+  def verif_nom(self,event=None):
+        """
+        Lance la vérification du nom présent dans entry_nom
+        """
+        nom = self.entry_nom.get()
+        if nom == '':
+            test,erreur = 0,"Aucun nom fourni !"
+        else:
+            test,erreur = self.node.item.verif_nom(nom)
+        if not test:
+            widgets.showerror("Nom invalide",erreur)
+            self.entry_nom.focus()
+            self.entry_nom.selection_range(0,END)
+            self.parent.appli.affiche_infos("%s n'est pas un nom valide pour une FORMULE" %nom)
+        else:
+            self.parent.appli.affiche_infos("%s est un nom valide pour une FORMULE" %nom)
+            self.entry_arg.focus()
+
+  def verif_arguments(self,event=None):
+        """
+        Lance la vérification des arguments présents dans entry_arg
+        """
+        arguments = self.entry_arg.get()
+        if arguments == '' :
+            test,erreur = 0,"Aucun argument fourni"
+        else:
+            test,erreur = self.node.item.verif_arguments(arguments)
+        if not test:
+            widgets.showerror("Argument(s) invalide(s)",erreur)
+            self.entry_arg.focus()
+            self.entry_arg.selection_range(0,END)
+            self.parent.appli.affiche_infos("Argument(s) invalide(s) pour une FORMULE")
+        else:
+            self.parent.appli.affiche_infos("Argument(s) valide(s) pour une FORMULE")
+            self.entry_exp.focus()
+
+  def verif_corps(self,event=None):
+        """
+        Lance la vérification du corps de formule présent dans entry_exp
+        """
+        new_nom = self.entry_nom.get()
+        new_typ="REEL"
+        new_arg = self.entry_arg.get()
+        new_exp = self.entry_exp.get()
+        if new_exp == '':
+            test,erreur = 0,"Aucune expression fournie !"
+        else:
+            test,erreur = self.node.item.verif_formule_python((new_nom,new_typ,new_arg,new_exp))
+        if not test:
+            widgets.showerror("Corps de FORMULE invalide",erreur)
+            self.entry_exp.focus()
+            self.entry_exp.selection_range(0,END)
+            self.parent.appli.affiche_infos("Corps de FORMULE invalide")
+        else:
+            self.parent.appli.affiche_infos("Corps de FORMULE valide")
+            
+class FORMULETreeItem(compooper.EtapeTreeItem):
+    """
+    Classe servant à définir l'item porté par le noeud de l'arbre d'EFICAS
+    qui représente la FORMULE
+    """
+    panel = FORMULEPanel
+
+    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 à 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'icône à 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 à 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,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éjà 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/InterfaceTK/compojdc.py b/InterfaceTK/compojdc.py
new file mode 100644 (file)
index 0000000..fb9b7d7
--- /dev/null
@@ -0,0 +1,168 @@
+# -*- 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 Pmw
+from Editeur import Objecttreeitem
+import panels
+
+from widgets import ListeChoix
+
+class JDCPanel(panels.OngletPanel):
+  def init(self):
+      """ Initialise les frame des panneaux contextuels relatifs à un JDC """
+      panneau=Pmw.PanedWidget(self,orient='horizontal')
+      panneau.add('left',min=0.4,max=0.6,size=0.5)
+      panneau.add('right',min=0.4,max=0.6,size=0.5)
+      panneau.pack(expand=1,fill='both')
+      self.bouton_com.pack_forget()
+      self.makeJDCPage(panneau.pane('left'))
+      self.makeReglesPage(panneau.pane('right'))
+      self.enlevebind()
+    
+  def makeReglesPage(self,page) :
+    regles = []
+    regles = self.node.item.get_regles()
+    texte_regles = []
+    l_regles_en_defaut=[]
+    if len(regles) > 0:
+      l_noms_etapes = self.node.item.get_l_noms_etapes()
+      i = 0
+      for regle in regles :
+        texte_regles.append(regle.gettext())
+        texte,test = regle.verif(l_noms_etapes)
+        if test == 0 : l_regles_en_defaut.append(i)
+        i = i+1
+    Liste = ListeChoix(self,page,texte_regles,liste_marques=l_regles_en_defaut,active='non',titre="Règles")
+    Liste.affiche_liste()
+    # aide associée au panneau
+    bulle_aide="""Ce panneau contient la liste des règles qui s'appliquent à l'objet
+    en cours d'édition.
+    - en noir : règles valides
+    - en rouge : règles violées"""
+    Liste.MCbox.bind("<Button-3>", lambda e,s=self,a=bulle_aide : s.parent.appli.affiche_aide(e,a))
+    Liste.MCbox.bind("<ButtonRelease-3>",self.parent.appli.efface_aide)
+
+import treewidget
+class Node(treewidget.Node):
+    def doPaste_Commande(self,objet_a_copier):
+        """
+          Réalise la copie de l'objet passé en argument qui est nécessairement
+          une commande
+        """
+        #child = self.item.append_child(objet_a_copier,pos='first')
+        child = self.append_child(objet_a_copier,pos='first',retour='oui')
+        #if child is None : return 0
+        return child
+
+
+class JDCTreeItem(Objecttreeitem.ObjectTreeItem):
+  panel = JDCPanel
+  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):
+      #print "get_liste_cmd",self.object.niveau.definition
+      listeCmd = self.object.niveau.definition.get_liste_cmd()
+      return listeCmd
+
+import Accas
+treeitem =JDCTreeItem
+objet = Accas.JDC    
diff --git a/InterfaceTK/compomacro.py b/InterfaceTK/compomacro.py
new file mode 100644 (file)
index 0000000..54a19c9
--- /dev/null
@@ -0,0 +1,311 @@
+# -*- 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 os,sys,string
+import types
+import Tkinter
+import Pmw
+import traceback
+
+# Modules Eficas
+from Editeur import Objecttreeitem
+import panels
+from InterfaceTK import fontes
+import compooper
+import convert
+from widgets import askopenfilename
+from widgets import Fenetre,FenetreYesNo
+from widgets import showinfo,showerror
+
+#
+__version__="$Name: BR_V1_12qt $"
+__Id__="$Id: compomacro.py,v 1.26 2006-12-15 16:00:21 cchris Exp $"
+#
+
+class MACROPanel(panels.OngletPanel):
+  def init(self):
+    nb = Pmw.NoteBook(self,raisecommand=self.raisecmd)
+    nb.pack(fill = 'both', expand = 1)
+    self.nb=nb
+    nb.add('Mocles', tab_text='Ajouter mots-clés')
+    typsd=self.node.item.object.get_type_produit()
+    ficini = self.node.item.wait_fichier_init()
+    if typsd != None:
+      nb.add('Concept', tab_text='Nommer concept')
+    if ficini == 1:
+      nb.add('Fichierinit',tab_text = 'Fichier %s' %self.node.item.get_nom())
+    nb.add('Commande', tab_text='Nouvelle Commande')
+    nb.add('Commentaire',tab_text='Paramètre/Commentaire')
+    panneau=Pmw.PanedWidget(nb.page("Mocles"),
+                            orient='horizontal')
+    panneau.add('left',min=0.4,max=0.6,size=0.5)
+    panneau.add('right',min=0.4,max=0.6,size=0.5)
+    panneau.pack(expand=1,fill='both')
+    self.makeCommandePage(nb.page("Commande"))
+    if typsd != None:
+      self.makeConceptPage(nb.page("Concept"))
+    if ficini == 1 :
+      self.makeFichierPage(nb.page('Fichierinit'))
+    self.makeMoclesPage(panneau.pane('left'))
+    self.makeReglesPage(panneau.pane('right'))
+    self.makeParamCommentPage_for_etape(nb.page("Commentaire"))
+    nb.tab('Mocles').focus_set()
+    nb.setnaturalsize()
+    self.enlevebind()
+    self.creebind()
+    self.affiche()
+
+  def makeFichierPage(self,page):
+    """
+    Affiche la page d'onglet correspondant au changement du fichier
+    dont a besoin la macro
+    """
+    titre = Tkinter.Label(page,text="La commande %s requiert un fichier " %self.node.item.get_nom())
+    titre.place(relx=0.5,rely=0.2,anchor='center')
+    frameMain=Tkinter.Frame(page)
+    frameMain.place(relx=0.5,rely=0.4,anchor='center',relwidth=1.)
+    Tkinter.Label(frameMain,text="Fichier :").pack(side='left',padx=5)
+    self.entry = Tkinter.Entry(frameMain,relief='sunken',bg='white')
+    self.entry.pack(side='left',padx=5,fill='x',expand=1)
+    frameButtons=Tkinter.Frame(page)
+    but1=Tkinter.Button(frameButtons,text='Valider',command = self.change_fichier_init)
+    but2=Tkinter.Button(frameButtons,text='Browse',command = self.browse_fichier_init)
+    but3=Tkinter.Button(frameButtons,text='Annuler',command = self.annule_fichier_init)
+    but1.grid(row=0,column=0,padx=5,pady=5)
+    but2.grid(row=0,column=1,padx=5,pady=5)
+    but3.grid(row=0,column=2,padx=5,pady=5)
+    frameButtons.place(relx=0.5,rely=0.6,anchor='center')
+
+    if hasattr(self.node.item.object,'fichier_ini'):
+      if self.node.item.object.fichier_ini :
+        self.entry.insert(0,self.node.item.object.fichier_ini)
+    self.entry.focus()
+
+  def convert_file(self,file):
+     """
+         Methode pour convertir le fichier file dans le format courant
+     """
+     format=self.parent.appli.format_fichier.get()
+     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.parent.appli.affiche_infos("Erreur à la conversion")
+            Fenetre(self,
+                    titre="compte-rendu d'erreurs, EFICAS ne sait pas convertir ce fichier",
+                    texte = str(p.cr))
+            return None
+         return text
+     else:
+         # Il n'existe pas c'est une erreur
+         self.parent.appli.affiche_infos("Type de fichier non reconnu")
+         showerror("Type de fichier non reconnu","EFICAS ne sait pas ouvrir ce type de fichier")
+         return None
+
+  def change_fichier_init(self,event=None):
+    """ 
+        Effectue le changement de fichier d'initialisation s'il est valide 
+    """
+    new_fic = self.entry.get()
+    if not os.path.isfile(new_fic) :
+      showinfo("Fichier introuvable","Le fichier que vous avez saisi\n"+
+               "n'est pas un nom de fichier valide !")
+      self.parent.appli.affiche_infos("Fichier introuvable")
+      return
+    # On convertit le fichier
+    text=self.convert_file(new_fic)
+    # Si probleme a la lecture-conversion on arrete le traitement
+    if not text:
+       return
+
+    try:
+      self.node.item.object.change_fichier_init(new_fic,text)
+      self.parent.appli.affiche_infos("Fichier %s modifié" %self.node.item.get_nom())
+    except:
+      # Erreurs lors de l'evaluation de text dans un JDC auxiliaire
+      self.parent.appli.affiche_infos("Fichier invalide")
+      l=traceback.format_exception_only("Fichier invalide",sys.exc_info()[1])
+      f=FenetreYesNo(self.parent.appli,titre="Fichier invalide : voulez vous retablir l ancien fichier ?",
+                             texte="Erreur dans l'interprétation du nouveau fichier ...\n\n"+string.join(l),
+                             yes="Retablir",no="Changer")
+      f.wait()
+      reponse=f.result
+      if reponse:
+         # On retablit l'ancien fichier
+         self.entry.delete(0,Tkinter.END)
+         self.node.item.object.restore_fichier_init()
+         self.parent.appli.affiche_infos("Fichier invalide ... Ancien fichier restauré")
+         fic=self.node.item.object.fichier_ini
+         if fic:
+             self.entry.insert(0,fic)
+      else:
+         self.node.item.object.force_fichier_init()
+         self.parent.appli.affiche_infos("Fichier invalide ... Nouveau fichier mémorisé")
+
+  def annule_fichier_init(self,event=None):
+    """ Restaure dans self.entry le nom de fichier_init"""
+    self.entry.delete(0,Tkinter.END)
+    if self.node.item.object.fichier_ini:
+       self.entry.insert(0,self.node.item.object.fichier_ini)
+
+  def browse_fichier_init(self,event=None):
+    """ 
+         Propose à l'utilisateur une Bsf et retourne le fichier 
+         sélectionné dans self.entry 
+    """
+    file = askopenfilename(title="Choix du fichier %s" %self.node.item.get_nom())
+    if file :
+      self.entry.delete(0,Tkinter.END)
+      self.entry.insert(0,file)
+    
+  def update_panel(self):
+    if hasattr(self,"entry"):
+       self.annule_fichier_init()
+    
+class MACROTreeItem(compooper.EtapeTreeItem):
+  """ Cette classe hérite d'une grande partie des comportements
+      de la classe compooper.EtapeTreeItem
+  """
+  panel=MACROPanel
+
+class INCLUDETreeItemBase(MACROTreeItem):
+  rmenu_specs=[("View","makeView"),
+               ("Edit","makeEdit"),
+              ]
+
+  def __init__(self,appli, labeltext, object, setfunction):
+    MACROTreeItem.__init__(self,appli, labeltext, object, setfunction)
+
+  def iscopiable(self):
+      """
+      Retourne 1 si l'objet est copiable, 0 sinon
+      """
+      return 0
+
+  def makeEdit(self,appli,node):
+    #print "makeEdit",self.object,self.object.nom
+    #print "makeEdit",self.object.jdc_aux,self.object.jdc_aux.nom
+    #print "makeEdit",self.object.jdc_aux.context_ini
+    if self.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.object.text_error
+        Fenetre(self,titre="Include non editable",texte=msg,wrap='none')
+        return
+
+    if not hasattr(self.object,"jdc_aux") or self.object.jdc_aux is None:
+       #L'include n'est pas initialise
+       self.object.build_include(None,"")
+
+    # On cree un nouvel onglet dans le bureau
+    appli.bureau.ShowJDC(self.object.jdc_aux,self.object.jdc_aux.nom,
+                             label_onglet=None,
+                             JDCDISPLAY=macrodisplay.MACRODISPLAY)
+
+  def makeView(self,appli,node):
+    if not hasattr(self.object,"jdc_aux") or self.object.jdc_aux is None:
+         showerror("Include vide",
+                 "L'include doit etre correctement initialisé pour etre visualisé")
+         return
+
+    nom=self.object.nom
+    if hasattr(self.object,'fichier_ini'):
+       if self.object.fichier_ini is None:
+          nom=nom+' '+"Fichier non défini"
+       else:
+          nom=nom+' '+self.object.fichier_ini
+    macdisp=macrodisplay.makeMacroDisplay(appli,self,nom)
+
+class INCLUDEPanel(MACROPanel):
+  def makeFichierPage(self,page):
+    """
+    Affiche la page d'onglet correspondant au changement du fichier INCLUDE
+    """
+    if not hasattr(self.node.item.object,'fichier_ini'):
+       titre = Tkinter.Label(page,text="L'INCLUDE n'a pas de fichier associé\nIl faut d'abord choisir un numero d'unité " )
+       titre.place(relx=0.5,rely=0.5,anchor='center')
+    else:
+       MACROPanel.makeFichierPage(self,page)
+
+class INCLUDETreeItem(INCLUDETreeItemBase):
+   panel=INCLUDEPanel
+
+class POURSUITETreeItem(INCLUDETreeItemBase): 
+  def makeEdit(self,appli,node):
+    if self.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.object.text_error
+        Fenetre(self,titre="Poursuite non editable",texte=msg,wrap='none')
+        return
+
+    if not hasattr(self.object,"jdc_aux") or self.object.jdc_aux is None:
+       #La poursuite n'est pas initialisee
+       text="""DEBUT()
+FIN()"""
+       self.object.build_poursuite(None,text)
+
+    # On cree un nouvel onglet dans le bureau
+    appli.bureau.ShowJDC(self.object.jdc_aux,self.object.jdc_aux.nom,
+                             label_onglet=None,
+                             JDCDISPLAY=macrodisplay.MACRODISPLAY)
+
+  def makeView(self,appli,node):
+    if not hasattr(self.object,"jdc_aux") or self.object.jdc_aux is None:
+         showerror("Poursuite vide","Une POURSUITE doit etre correctement initialisée pour etre visualisée")
+         return
+    nom=self.object.nom
+    if hasattr(self.object,'fichier_ini'):
+       if self.object.fichier_ini is None:
+          nom=nom+' '+"Fichier non défini"
+       else:
+          nom=nom+' '+self.object.fichier_ini
+    macdisp=macrodisplay.makeMacroDisplay(appli,self,nom)
+
+class INCLUDE_MATERIAUTreeItem(INCLUDETreeItemBase):
+  rmenu_specs=[("View","makeView"),
+              ]
+  def iscopiable(self):
+      """
+      Retourne 1 si l'objet est copiable, 0 sinon
+      """
+      return 1
+
+
+def treeitem(appli, labeltext, object, setfunction=None):
+   """ Factory qui retourne l'item adapté 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
+    
+import macrodisplay
diff --git a/InterfaceTK/compomclist.py b/InterfaceTK/compomclist.py
new file mode 100644 (file)
index 0000000..ba3704c
--- /dev/null
@@ -0,0 +1,225 @@
+# -*- 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 types
+from Tkinter import *
+import Pmw
+
+from Noyau.N_OBJECT import ErrorObj
+from Editeur import Objecttreeitem
+import panels
+import traceback
+
+class MCLISTPanel(panels.Panel):
+    def init(self):
+        test_ajout = self.node.item.ajout_possible()
+        nom_mcfact = self.node.item.get_nom()
+        if test_ajout:
+            texte = "Pour ajouter une autre occurrence du mot-clé facteur %s, cliquez ci-dessous" %nom_mcfact
+        else:
+            texte = "Vous ne pouvez pas ajouter une autre occurrence du mot-clé facteur %s ?" %nom_mcfact
+        self.label = Label(self,text = texte)
+        self.label.place(relx=0.5,rely=0.4,anchor='center')
+        if test_ajout:
+            self.but=Button(self,text="AJOUTER",command=self.ajout_occurrence)
+            self.but.place(relx=0.5,rely=0.6,anchor='center')
+            #Button(self,text="NON",command=None).place(relx=0.6,rely=0.6,anchor='center')
+
+    def ajout_occurrence(self,event=None):
+        self.node.parent.append_child(self.node.item.get_nom())
+
+import compofact
+import compoerror
+import treewidget
+
+class Node(treewidget.Node):
+    def doPaste(self,node_selected):
+        objet_a_copier = self.item.get_copie_objet()
+        child=node_selected.doPaste_MCF(objet_a_copier)
+        #print "doPaste",child
+        return child
+
+    def doPaste_MCF(self,objet_a_copier):
+        if self.item.isMCList() :
+          # le noeud courant est une MCList
+          child = self.append_child(objet_a_copier,pos='first',retour='oui')
+          #child = self.parent.append_child(objet_a_copier,pos='first',retour='oui')
+        elif self.item.isMCFact() :
+          # le noeud courant est un MCFACT
+          if self.parent.item.isMCList():
+             # le noeud selectionne est un MCFACT dans une MCList
+             child = self.parent.append_child(objet_a_copier,
+                                              pos=self.item,
+                                              retour='oui')
+          else:
+             # le noeud MCFACT selectionne n'est pas dans une MCList
+             child = self.parent.append_child(objet_a_copier,retour='oui')
+        else:
+          showinfo("Copie impossible",
+                   "Vous ne pouvez coller le mot-clé facteur copié à ce niveau de l'arborescence !")
+          self.appli.affiche_infos("Copie refusée")
+          child=None
+        #print "doPaste_MCF",child
+        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 clé 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-clé " + obj.nom + " supprimé"
+           self.appli.affiche_infos(message)
+           return 1
+        else:
+           self.appli.affiche_infos('Impossible de supprimer ce mot-clé')
+           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/InterfaceTK/componiveau.py b/InterfaceTK/componiveau.py
new file mode 100644 (file)
index 0000000..e96fea4
--- /dev/null
@@ -0,0 +1,133 @@
+# -*- 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 Tkinter import *
+import Pmw
+
+from Editeur import Objecttreeitem
+import panels
+from InterfaceTK import fontes
+from Extensions import commentaire 
+
+Fonte_Niveau = fontes.canvas_gras_italique
+Fonte_Niveau_inactif = fontes.canvas_italique
+
+class NIVEAUPanel(panels.OngletPanel):
+    def init(self):
+        """ Initialise les frame des panneaux contextuels relatifs à un JDC """
+        panneau=Pmw.PanedWidget(self,orient='horizontal')
+        panneau.add('left',min=0.4,max=0.6,size=0.5)
+        panneau.add('right',min=0.4,max=0.6,size=0.5)
+        panneau.pack(expand=1,fill='both')
+        self.bouton_com.pack_forget()
+        self.makeJDCPage(panneau.pane('left'))
+        self.enlevebind()
+
+
+import treewidget
+class Node(treewidget.Node):pass
+
+
+class NIVEAUTreeItem(Objecttreeitem.ObjectTreeItem):
+  panel = NIVEAUPanel
+  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/InterfaceTK/componuplet.py b/InterfaceTK/componuplet.py
new file mode 100644 (file)
index 0000000..c14573d
--- /dev/null
@@ -0,0 +1,175 @@
+# -*- 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
+import Tkinter
+import Pmw
+from repr import Repr
+from copy import copy,deepcopy
+
+# Modules Eficas
+from Editeur import Objecttreeitem
+import panels
+
+#
+__version__="$Name: BR_V1_12qt $"
+__Id__="$Id: componuplet.py,v 1.9 2005-12-07 10:20:34 eficas Exp $"
+#
+
+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
+
+class NUPLETPanel(panels.OngletPanel):
+  def init(self):
+      """ Initialise les frame des panneaux contextuels relatifs \340 un NUPLET """
+      self.nb=Pmw.NoteBook(self,raisecommand=self.raisecmd)
+      self.nb.pack(fill = 'both', expand = 1)
+      self.nb.add("Valeurs",tab_text="Saisir valeurs")
+      self.makeValeurPage(self.nb.page('Valeurs'))
+      self.enlevebind()
+      self.creebind()
+      self.nb.setnaturalsize()
+    
+  def makeValeurPage(self,page):
+    label = Tkinter.Label(page,text='Valeurs :').pack(side=Tkinter.LEFT)
+    i=0
+    for obj in self.node.item.object.mc_liste:
+      frame_valeur=Tkinter.Frame(page)
+      frame_valeur.pack(side=Tkinter.LEFT)
+      if hasattr(obj,'definition'):
+         objet_mc=obj.definition
+      else:  
+         objet_mc=None
+      valeur=obj.valeur
+      if type(valeur) == types.InstanceType :
+        valeur=obj.getval()
+      aide=self.gen_aide(obj)
+      if objet_mc.into != None :
+        l_choix=list(objet_mc.into)
+        #obj.set_valeur(l_choix[0],evaluation='non')
+        obj.set_valeur(l_choix[0])
+        option=Pmw.OptionMenu (frame_valeur,
+                items = l_choix,
+                menubutton_width = 10,
+                command = lambda e,obj=obj,s=self:s.record_valeur(val=e,obj=obj),
+        )
+        option.pack(side=Tkinter.LEFT,padx=1)
+      else :
+        entry = Tkinter.Entry(frame_valeur,relief='sunken',width=10)
+        entry.pack(side=Tkinter.LEFT,padx=1)
+        entry.bind("<Return>",
+                lambda e,obj=obj,s=self:s.valid_valeur(e,obj=obj))
+        entry.bind("<KP_Enter>",
+                lambda e,obj=obj,s=self:s.valid_valeur(e,obj=obj))
+        if i==0:entry.focus_set()
+        #aide = Tkinter.Label(frame_valeur, text = aide)
+        #aide.place(relx=0.5,rely=0.55,anchor='n')
+        if valeur != None :
+          entry.delete(0,Tkinter.END)
+          entry.insert(0,obj.getval())
+      i=i+1
+
+  def record_valeur(self,val=None,obj=None,mess='Valeur du mot-cl\351 enregistr\351e'):
+    """ 
+      Enregistre  val comme valeur de self.node.item.object SANS faire de 
+      test de validité
+    """
+    #obj.set_valeur(val,evaluation='non')
+    obj.set_valeur(val)
+    self.parent.appli.affiche_infos(mess)
+    #self.node.parent.verif()
+    #self.node.update()
+
+  def valid_valeur(self,e,obj=None,mess='Valeur du mot-cl\351 enregistr\351e'):
+    """ 
+      Enregistre  val comme valeur de self.node.item.object avec
+      test de validité
+    """
+    valeur=e.widget.get()
+    e.widget.delete(0,Tkinter.END)
+    anc_val=obj.getval()
+    if anc_val == None:anc_val=''
+    test=obj.set_valeur(valeur)
+    if test:
+      if obj.isvalid():
+          self.parent.appli.affiche_infos('Valeur du mot-cl\351 enregistr\351e')
+          e.widget.insert(0,obj.getval())
+      else:
+          #obj.set_valeur(anc_val,evaluation='non')
+          obj.set_valeur(anc_val)
+          self.parent.appli.affiche_infos("valeur du mot-cl\351 non autoris\351e")
+          e.widget.insert(0,anc_val)
+    else:
+      print "impossible d'\351valuer : %s " %valeur
+      print "test =",test
+      self.parent.appli.affiche_infos("valeur du mot-cl\351 non autoris\351e")
+      e.widget.delete(0,Tkinter.END)
+      e.widget.insert(0,anc_val)
+          
+    #self.node.parent.verif()
+    #self.node.update()
+
+  def gen_aide(self,obj):
+    return ""
+    
+
+class NUPLETTreeItem(Objecttreeitem.ObjectTreeItem):
+  panel=NUPLETPanel
+
+  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/InterfaceTK/compooper.py b/InterfaceTK/compooper.py
new file mode 100644 (file)
index 0000000..f153122
--- /dev/null
@@ -0,0 +1,325 @@
+# -*- 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 Tkinter import *
+import Pmw
+import traceback
+from Editeur import Objecttreeitem
+import panels
+from InterfaceTK import fontes
+
+class OPERPanel(panels.OngletPanel):
+
+  def init(self):
+    nb = Pmw.NoteBook(self,raisecommand=self.raisecmd)
+    nb.pack(fill = 'both', expand = 1)
+    self.nb=nb
+    nb.add('Mocles', tab_text='Nouveau mot-clé')
+    nb.add('Concept', tab_text='Nommer concept')
+    nb.add('Commande', tab_text='Nouvelle Commande')
+    nb.add('Commentaire',tab_text='Paramètre/Commentaire')
+    panneau=Pmw.PanedWidget(nb.page("Mocles"),
+                            orient='horizontal')
+    panneau.add('left',min=0.4,max=0.60,size=0.50)
+    panneau.add('right',min=0.4,max=0.60,size=0.50)
+    panneau.pack(expand=1,fill='both')
+    panneau.setnaturalsize()
+    self.makeCommandePage(nb.page("Commande"))
+    self.makeConceptPage_oper(nb.page("Concept"))
+    self.makeMoclesPage(panneau.pane('left'))
+    self.makeReglesPage(panneau.pane('right'))
+    #self.makeCommentairePage(nb.page("Commentaire"))
+    self.makeParamCommentPage_for_etape(nb.page("Commentaire"))
+    nb.tab('Mocles').focus_set()
+    self.nb.setnaturalsize()
+    self.enlevebind()
+    self.creebind()
+    self.affiche()
+
+  def makeConceptPage_oper(self,page):
+      """ Crée la page de saisie du nom du concept """
+      if self.node.item.is_reentrant():
+          # commande obligatoirement reentrante
+          self.makeConceptPage_reentrant(page)
+      else:
+          # commande non reentrante ou facultativement reentrante
+          self.makeConceptPage(page)
+
+  def makeConceptPage_reentrant(self,page):
+      """ Crée la page de saisie du nom de concept pour un opérateur reentrant
+      cad propose dans la liste des SD utilisées dans la commande celle(s) dont le
+      type est compatible avec celui que retourne l'opérateur """
+      liste_noms_sd = self.node.item.get_noms_sd_oper_reentrant()
+      self.listbox = Pmw.ScrolledListBox(page,
+                                         items=liste_noms_sd,
+                                         labelpos='n',
+                                         label_text="Structure(s) de données à enrichir par l'opérateur courant :",
+                                         listbox_height = 6,
+                                         selectioncommand=self.select_valeur_from_list,
+                                         dblclickcommand=lambda s=self,c=self.execConcept : s.choose_valeur_from_list(c))
+      self.listbox.place(relx=0.5,rely=0.3,relheight=0.4,anchor='center')
+      Label(page,text='Structure de donnée choisie :').place(relx=0.05,rely=0.6)
+      self.valeur_choisie = StringVar()
+      self.label_valeur = Label(page,textvariable=self.valeur_choisie)
+      self.label_valeur.place(relx=0.45,rely=0.6)
+      if len(liste_noms_sd) == 1 :
+          self.valeur_choisie.set(liste_noms_sd[0])
+
+  def select_valeur_from_list(self):
+      try:
+          choix = self.listbox.getcurselection()[0]
+          self.valeur_choisie.set(choix)
+      except:
+          traceback.print_exc()
+          
+
+  def choose_valeur_from_list(self,command):
+      try:
+          choix = self.listbox.getcurselection()[0]
+          self.valeur_choisie.set(choix)
+          apply(command,(),{})
+      except:
+          traceback.print_exc()
+
+import treewidget
+class Node(treewidget.Node):
+    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.doPaste_Commande(objet_a_copier)
+        return child
+
+    def doPaste_Commande(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 doPaste_MCF(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
+
+
+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 accès aux attributs
+      Dans le cas d'une ETAPE, _object et object pointent vers le 
+      meme objet.
+  """
+  panel = OPERPanel
+  itemNode=Node
+  
+  def IsExpandable(self):
+      return 1
+
+  def GetIconName(self):
+      """
+      Retourne le nom de l'icône à 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:
+         return "ast-red-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
+      """
+      if self.object.isactif():
+        # None --> fonte et couleur par défaut
+        return self.labeltext,None,None
+      else:
+        return self.labeltext,fontes.standard_italique,None
+      
+  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):
+      #print "compooper.additem",name,pos
+      mcent = self._object.addentite(name,pos)
+      return mcent
+
+  def suppitem(self,item) :
+      # item : item du MOCLE de l'ETAPE à 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.get()
+      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.get()
+      g=generator.plugins[format]()
+      texte_commande = g.gener(self.object,format='beautifie')
+      # Il faut enlever la première 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
+
+  def visu_3D(self,appli,node) :
+      import TroisDPal
+      troisD=TroisDPal.TroisDPilote(node.item,appli,node.parent)
+      troisD.envoievisu()
+
+import Accas
+treeitem = EtapeTreeItem
+objet = Accas.ETAPE    
+
diff --git a/InterfaceTK/compoparam.py b/InterfaceTK/compoparam.py
new file mode 100644 (file)
index 0000000..f842f44
--- /dev/null
@@ -0,0 +1,248 @@
+# -*- 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 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
+from Tkinter import *
+import Pmw
+import string
+
+# import modules EFICAS
+from Editeur import Objecttreeitem
+import panels
+from InterfaceTK import fontes
+
+
+Fonte_PARAMETRE = fontes.standard_italique
+Fonte_TITRE = fontes.standard_gras_souligne
+
+
+class PARAMPanel(panels.OngletPanel):
+  """
+  Classe servant à construire le panneau associé à un paramètre.
+  C'est au moyen de ce panneau que l'utilisateur peut accéder
+  aux nom et valeur du paramètre en vue éventuellement de les
+  modifier.
+  """
+
+  def init(self):
+    """
+    Initialise les frame des panneaux contextuels relatifs à un PARAMETRE
+    """
+    nb = Pmw.NoteBook(self,raisecommand=self.raisecmd)
+    nb.pack(fill = 'both', expand = 1)
+    self.nb=nb
+    nb.add('Parametre', tab_text='Valeur Paramètre')
+    nb.add('Commande', tab_text='Nouvelle Commande')
+    nb.add('Commentaire',tab_text='Paramètre/Commentaire')
+    self.makeParametrePage(nb.page("Parametre"))
+    self.makeCommandePage(nb.page("Commande"))
+    self.makeParamCommentPage_for_etape(nb.page("Commentaire"))
+    nb.tab('Parametre').focus_set()
+    nb.setnaturalsize()
+    self.make_buttons()
+    self.enlevebind()
+    self.creebind()
+    
+  def makeParametrePage(self,page):
+    """
+    Crée la page qui permet d'afficher et d'éditer le texte du PARAMETRE
+    """
+    self.frame_valeur = Frame(page)
+    #self.frame_valeur.place(relwidth=0.9,relheight=0.9,relx=0.05,rely=0.05,anchor='nw')
+    self.frame_valeur.pack(expand=1)
+    # affichage du titre du panneau
+    self.titre = StringVar()
+    self.titre.set("PARAMETRE "+self.node.item.get_nom())
+    #Label(self.frame_valeur,textvariable=self.titre,font=Fonte_TITRE).place(relx=0.5,rely=0.1,anchor='n')
+    Label(self.frame_valeur,textvariable=self.titre,font=Fonte_TITRE).grid(row=0,columnspan=2,padx=5,pady=5)
+    # création des labels et entries associés aux nom et valeur du paramètre
+    #Label(self.frame_valeur,text= 'Nom du paramètre : ').place(relx=0.,rely=0.3)
+    Label(self.frame_valeur,text= 'Nom du paramètre : ').grid(row=1,sticky=W,padx=5,pady=5)
+    self.entry_nom = Entry(self.frame_valeur)
+    #Label(self.frame_valeur,text= 'Valeur du paramètre : ').place(relx=0.,rely=0.5)
+    Label(self.frame_valeur,text= 'Valeur du paramètre : ').grid(row=2,sticky=W,padx=5,pady=5)
+    self.entry_val = Entry(self.frame_valeur)
+    # binding sur entry_nom
+    self.entry_nom.bind("<Return>",lambda e,s=self : s.entry_val.focus())
+    self.entry_val.bind("<Return>",lambda e,s=self : s.change_valeur())
+    self.entry_nom.bind("<KP_Enter>",lambda e,s=self : s.entry_val.focus())
+    self.entry_val.bind("<KP_Enter>",lambda e,s=self : s.change_valeur())
+    # affichage des entries
+    #self.entry_nom.place(relx=0.35,rely=0.3,relwidth=0.3)
+    self.entry_nom.grid(row=1,column=1,sticky=W,padx=5,pady=5)
+    #self.entry_val.place(relx=0.35,rely=0.5,relwidth=0.5)
+    self.entry_val.grid(row=2,column=1,sticky=W,padx=5,pady=5)
+    # affichage d'une phrase d'aide
+    aide = """
+    Un retour de chariot dans une zone de saisie vous permet de vérifier si
+    la valeur que vous avez entrée est valide.
+    Ce n'est qu'après avoir appuyé sur le bouton Valider que les nouvelles
+    valeurs seront effectivement prises en compte
+    """
+    #Label(self.frame_valeur,text=aide).place(relx=0.5,rely=0.65,anchor='n')
+    Label(self.frame_valeur,text=aide).grid(row=3,columnspan=2,padx=5,pady=5)
+    self.frame_valeur.columnconfigure(1,weight=1)
+    # affichage des nom et valeur du paramètre
+    self.display_valeur()
+    self.entry_nom.focus()
+
+  def make_buttons(self):
+    """
+    Crée les boutons du panneau
+    """
+    #self.bouton_sup.place_forget()
+    #self.bouton_doc.place_forget()
+    #self.bouton_val = Button(self.fr_but,text='Valider',command=self.change_valeur,width=14)
+    #self.bouton_ann = Button(self.fr_but,text='Annuler',command=self.display_valeur,width=14)
+    #self.bouton_val.place(relx=0.25,rely=0.5,relheight=0.8,anchor='center')
+    #self.bouton_ann.place(relx=0.50,rely=0.5,relheight=0.8,anchor='center')
+    #self.bouton_sup.place(relx=0.75,rely=0.5,relheight=0.8,anchor='center')
+
+    self.bouton_sup.pack_forget()
+    self.bouton_doc.pack_forget()
+    self.bouton_val = Button(self.fr_but,text='Valider',command=self.change_valeur)
+    self.bouton_ann = Button(self.fr_but,text='Annuler',command=self.display_valeur)
+    self.bouton_val.pack(side='left',padx=5, pady=5)
+    self.bouton_ann.pack(side='left',padx=5, pady=5)
+    self.bouton_sup.pack(side='right',padx=5, pady=5)
+
+  def change_valeur(self):
+    """
+    Stocke la nouvelle valeur donnée par l'utilisateur comme valeur du PARAMETRE
+    """
+    if self.parent.modified == 'n' : self.parent.init_modif()
+    new_nom = self.entry_nom.get()
+    new_val = self.entry_val.get()
+    self.node.item.set_nom(new_nom)
+    self.node.item.set_valeur(new_val)
+    self.node.update()
+    self.display_valeur()
+    
+  def display_valeur(self):
+    """
+    Affiche dans self.widget_text la valeur de l'objet PARAMETRE
+    (annule d'éventuelles modifications faite par l'utilisateur)
+    """
+    self.entry_nom.delete(0,END)
+    self.entry_val.delete(0,END)
+    self.titre.set('PARAMETRE '+self.node.item.get_nom())
+    self.entry_nom.insert(END,self.node.item.get_nom())
+    self.entry_val.insert(END,self.node.item.get_valeur())
+
+class PARAMTreeItem(Objecttreeitem.ObjectTreeItem):
+    """
+    Classe servant à définir l'item porté par le noeud de l'arbre d'EFICAS
+    qui représente le PARAMETRE
+    """
+    panel = PARAMPanel
+
+    def init(self):
+      self.setfunction = self.set_valeur
+
+# ---------------------------------------------------------------------------
+#                   API du PARAMETRE pour l'arbre 
+# ---------------------------------------------------------------------------
+
+    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 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 'Paramètre',Fonte_PARAMETRE,None
+
+    def GetText(self):
+      """
+      Retourne le texte à afficher après le nom de la commande (ici après 'paramètre')
+      Ce texte est tronqué à 25 caractères
+      """
+      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 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/InterfaceTK/compoparameval.py b/InterfaceTK/compoparameval.py
new file mode 100644 (file)
index 0000000..23deafa
--- /dev/null
@@ -0,0 +1,311 @@
+# -*- 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 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
+from Tkinter import *
+import Pmw
+import string
+
+# import modules EFICAS
+import widgets
+from Editeur import Objecttreeitem
+import panels
+from InterfaceTK import fontes
+
+
+Fonte_PARAMETRE = fontes.standard_italique
+Fonte_TITRE = fontes.standard_gras_souligne
+
+
+class PARAM_EVALPanel(panels.OngletPanel):
+  """
+  Classe servant à construire le panneau associé à un paramètre.
+  C'est au moyen de ce panneau que l'utilisateur peut accéder
+  aux nom et valeur du paramètre en vue éventuellement de les
+  modifier.
+  """
+
+  def init(self):
+    """
+    Initialise les frame des panneaux contextuels relatifs à un PARAMETRE
+    """
+    nb = Pmw.NoteBook(self,raisecommand=self.raisecmd)
+    nb.pack(fill = 'both', expand = 1)
+    self.nb=nb
+    nb.add('Parametre', tab_text='Paramètre EVAL')
+    nb.add('Commande', tab_text='Nouvelle Commande')
+    nb.add('Commentaire',tab_text='Paramètre/Commentaire')
+    self.makeParametrePage(nb.page("Parametre"))
+    self.makeCommandePage(nb.page("Commande"))
+    self.makeParamCommentPage_for_etape(nb.page("Commentaire"))
+    nb.tab('Parametre').focus_set()
+    nb.setnaturalsize()
+    self.make_buttons()
+    
+  def makeParametrePage(self,page):
+    """
+    Crée la page qui permet d'afficher et d'éditer le texte du PARAMETRE
+    """
+    self.frame_valeur = Frame(page)
+    self.frame_valeur.place(relwidth=0.9,relheight=0.9,relx=0.05,rely=0.05,anchor='nw')
+    # affichage du titre du panneau
+    self.titre = StringVar()
+    self.titre.set("PARAMETRE EVAL "+self.node.item.get_nom())
+    Label(self.frame_valeur,textvariable=self.titre,font=Fonte_TITRE).place(relx=0.5,rely=0.1,anchor='n')
+    # création des labels et entries associés aux nom et valeur du paramètre
+    Label(self.frame_valeur,text= 'Nom du paramètre : ').place(relx=0.,rely=0.3)
+    self.entry_nom = Entry(self.frame_valeur)
+    Label(self.frame_valeur,text= 'Valeur du paramètre : ').place(relx=0.,rely=0.5)
+    self.entry_val = Entry(self.frame_valeur)
+    # binding sur entry_nom
+    self.entry_nom.bind("<Return>",lambda e,s=self : s.verif_nom())
+    self.entry_val.bind("<Return>",lambda e,s=self : s.verif_eval())
+    self.entry_nom.bind("<KP_Enter>",lambda e,s=self : s.verif_nom())
+    self.entry_val.bind("<KP_Enter>",lambda e,s=self : s.verif_eval())
+    # affichage des entries
+    self.entry_nom.place(relx=0.35,rely=0.3,relwidth=0.3)
+    self.entry_val.place(relx=0.35,rely=0.5,relwidth=0.5)
+    # affichage d'une phrase d'aide
+    aide = """
+    Un retour de chariot dans une zone de saisie vous permet de vérifier si
+    la valeur que vous avez entrée est valide.
+    Ce n'est qu'après avoir appuyé sur le bouton Valider que les nouvelles
+    valeurs seront effectivement prises en compte
+    """
+    Label(self.frame_valeur,text=aide).place(relx=0.5,rely=0.65,anchor='n')
+    # affichage des nom et valeur du paramètre
+    self.display_valeur()
+    self.entry_nom.focus()
+
+  def make_buttons(self):
+    """
+    Crée les boutons du panneau
+    """
+    #self.bouton_sup.place_forget()
+    #self.bouton_doc.place_forget()
+    self.bouton_sup.pack_forget()
+    self.bouton_doc.pack_forget()
+    #self.bouton_val = Button(self.fr_but,text='Valider',command=self.change_valeur,width=14)
+    #self.bouton_ann = Button(self.fr_but,text='Annuler',command=self.display_valeur,width=14)
+    self.bouton_val = Button(self.fr_but,text='Valider',command=self.change_valeur)
+    self.bouton_ann = Button(self.fr_but,text='Annuler',command=self.display_valeur)
+    self.bouton_val.bind("<Return>",lambda e,s=self : s.bouton_val.invoke())
+    self.bouton_val.bind("<KP_Enter>",lambda e,s=self : s.bouton_val.invoke())
+    #self.bouton_val.place(relx=0.25,rely=0.5,relheight=0.8,anchor='center')
+    #self.bouton_ann.place(relx=0.50,rely=0.5,relheight=0.8,anchor='center')
+    #self.bouton_sup.place(relx=0.75,rely=0.5,relheight=0.8,anchor='center')
+    self.bouton_val.pack(side='left',padx=5, pady=5)
+    self.bouton_ann.pack(side='left',padx=5, pady=5)
+    self.bouton_sup.pack(side='left',padx=5, pady=5)
+
+  def change_valeur(self):
+    """
+    Stocke la nouvelle valeur donnée par l'utilisateur comme valeur du PARAMETRE
+    """
+    if self.parent.modified == 'n' : self.parent.init_modif()
+    new_nom = self.entry_nom.get()
+    new_val = self.entry_val.get()
+    #self.node.item.set_nom(new_nom)
+    #self.node.item.set_valeur(new_val)
+    #self.node.update()
+    #self.display_valeur()
+    # on essaie de stocker les noms et valeurs
+    test,erreur = self.node.item.save_parametre_eval(new_nom,new_val)
+    if test :
+        # on a pu stocker les nouveaux paramètres : il faut rafraîchir l'affichage
+        self.node.update()
+        self.display_valeur()
+        self.parent.appli.affiche_infos("Expression EVAL %s modifiée" %self.node.item.get_nom())
+    else:
+        # la formule est incorrecte : on affiche les erreurs
+        widgets.showerror("Expression EVAL incorrecte",erreur)
+        self.parent.appli.affiche_infos("Expression EVAL %s non modifiée" %self.node.item.get_nom())
+    
+  def display_valeur(self):
+    """
+    Affiche dans self.widget_text la valeur de l'objet PARAMETRE
+    (annule d'éventuelles modifications faite par l'utilisateur)
+    """
+    self.entry_nom.delete(0,END)
+    self.entry_val.delete(0,END)
+    self.titre.set('PARAMETRE '+self.node.item.get_nom())
+    self.entry_nom.insert(END,self.node.item.get_nom())
+    self.entry_val.insert(END,self.node.item.get_valeur())
+
+  def verif_nom(self):
+    """
+    Lance la vérification du nom donné par l'utilisateur dans entry_nom
+    """
+    nom = self.entry_nom.get()
+    test,erreur = self.node.item.verif_nom(nom)
+    if not test :
+        widgets.showerror("Nom invalide",erreur)
+        self.entry_nom.focus()
+        self.entry_nom.selection_range(0,END)
+        self.parent.appli.affiche_infos("Nom du paramètre refusé")
+    else:
+        self.parent.appli.affiche_infos("Nom du paramètre accepté")
+        
+  def verif_eval(self,event=None):
+    """
+    Lance la vérification de l'expression EVAL présente dans entry_val
+    """
+    exp_eval = self.entry_val.get()
+    test,erreur = self.node.item.verif_eval(exp_eval)
+    if not test:
+        widgets.showerror("Expression EVAL invalide",erreur)
+        self.entry_val.focus()
+        self.entry_val.selection_range(0,END)
+        self.parent.appli.affiche_infos("Expression EVAL refusée")
+    else:
+        self.parent.appli.affiche_infos("Expression EVAL acceptée")
+
+class PARAM_EVALTreeItem(Objecttreeitem.ObjectTreeItem):
+    """
+    Classe servant à définir l'item porté par le noeud de l'arbre d'EFICAS
+    qui représente le PARAMETRE
+    """
+    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'icône 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 'EVAL',Fonte_PARAMETRE,None
+
+    def GetText(self):
+      """
+      Retourne le texte à afficher après le nom de la commande (ici après 'paramètre')
+      Ce texte est tronqué à 25 caractères
+      """
+      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 paramètre = 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 chaîne 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 paramètre
+      """
+      return self.object.get_nom()
+
+    def set_valeur(self,new_valeur):
+      """
+      Affecte new_valeur à l'objet PARAMETRE_EVAL
+      """
+      # on construit le texte de la nouvelle valeur
+      new_valeur = 'EVAL("""'+new_valeur+'""")'
+      # on affecte la nouvelle valeur à self.object
+      self.object.set_valeur(new_valeur)
+
+    def set_nom(self,new_nom):
+      """
+      Renomme le paramètre
+      """
+      self.object.set_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 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 paramètres comme nouveaux paramètres de l'EVAL courant et retourne 1
+          - si non, laisse les paramètres 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 paramètres
+          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/InterfaceTK/compoproc.py b/InterfaceTK/compoproc.py
new file mode 100644 (file)
index 0000000..63fb490
--- /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.
+#
+#
+# ======================================================================
+from Tkinter import *
+import Pmw
+
+from Editeur import Objecttreeitem
+import panels
+from InterfaceTK import fontes
+import compooper
+
+class PROCPanel(panels.OngletPanel):
+  def init(self):
+    nb = Pmw.NoteBook(self,raisecommand=self.raisecmd)
+    self.nb=nb
+    nb.pack(fill = 'both', expand = 1)
+    nb.add('Mocles', tab_text='Ajouter mots-clés')
+    nb.add('Commande', tab_text='Nouvelle Commande')
+    nb.add('Commentaire',tab_text='Paramètre/Commentaire')
+    panneau=Pmw.PanedWidget(nb.page("Mocles"),
+                            orient='horizontal')
+    panneau.add('left',min=0.4,max=0.6,size=0.5)
+    panneau.add('right',min=0.4,max=0.6,size=0.5)
+    panneau.pack(expand=1,fill='both')
+    self.makeCommandePage(nb.page("Commande"))
+    self.makeMoclesPage(panneau.pane('left'))
+    self.makeReglesPage(panneau.pane('right'))
+    self.makeParamCommentPage_for_etape(nb.page("Commentaire"))
+    nb.setnaturalsize()
+    self.enlevebind()
+    self.creebind()
+    self.affiche()
+
+class ProcEtapeTreeItem(compooper.EtapeTreeItem):
+  panel = PROCPanel
+  
+import Accas
+treeitem = ProcEtapeTreeItem
+objet = Accas.PROC_ETAPE    
+
diff --git a/InterfaceTK/composimp.py b/InterfaceTK/composimp.py
new file mode 100644 (file)
index 0000000..6f9d7b9
--- /dev/null
@@ -0,0 +1,652 @@
+# -*- 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 Tkinter import *
+import Pmw
+from copy import copy,deepcopy
+import traceback
+
+# Modules Eficas
+from Editeur import Objecttreeitem
+from Aster import prefs
+import panels
+import images
+from widgets import ListeChoix
+from widgets import FenetreDeSelection
+
+from Noyau.N_CR import justify_text
+from Editeur.utils import substract_list
+
+      
+class SIMPTreeItem(Objecttreeitem.AtomicObjectTreeItem):
+  from newsimppanel import newSIMPPanel
+  panel = newSIMPPanel
+
+  def init(self) :
+      self.expandable = 0
+      self.affect_panel()
+
+
+  def affect_panel(self):
+      """
+      Cette méthode attribue le panel à l'objet pointé par self en fonction de la
+      nature de la valeur demandée pour cet objet
+      """
+      from uniquepanel import UNIQUE_Panel
+      from plusieurspanel import PLUSIEURS_Panel
+
+      #print "affect_panel : ",self.nom,self.is_list(),self.has_into()
+      # Attention l ordre des if est important
+
+      if self.wait_shell():
+          # l'objet attend un shell
+          from shellpanel import SHELLPanel
+          self.panel = SHELLPanel
+      elif self.has_into():
+          # l'objet prend sa (ses) valeur(s) dans un ensemble discret de valeurs
+          if self.is_list() :
+             from plusieursintopanel import PLUSIEURS_INTO_Panel
+             self.panel = PLUSIEURS_INTO_Panel
+          else:
+             from uniqueintopanel import UNIQUE_INTO_Panel
+             self.panel = UNIQUE_INTO_Panel
+      else:
+          # l'objet prend une ou des valeurs à priori quelconques
+          if self.is_list() :
+              # on attend une liste de valeurs mais de quel type ?
+              if self.wait_assd():
+                  # on attend une liste de SD
+                  from plusieursassdpanel import PLUSIEURS_ASSD_Panel
+                  self.panel = PLUSIEURS_ASSD_Panel
+              else:
+                  # on attend une liste de valeurs de types debase (entiers, réels,...)
+                  #from plusieursbasepanel import PLUSIEURS_BASE_OR_UNELISTE_Panel
+                  #self.panel = PLUSIEURS_BASE_OR_UNELISTE_Panel
+                  from plusieursbasepanel import PLUSIEURS_BASE_Panel
+                  self.panel = PLUSIEURS_BASE_Panel
+          else:
+              # on n'attend qu'une seule valeur mais de quel type ?
+              if self.wait_co():
+                  # on attend une SD ou un objet de la classe CO (qui n'existe pas encore)
+                  from uniquesdcopanel import UNIQUE_SDCO_Panel
+                  self.panel = UNIQUE_SDCO_Panel
+              elif self.wait_assd():
+                  # on attend une SD
+                  from uniqueassdpanel import UNIQUE_ASSD_Panel
+                  from uniqueassdpanel import UNIQUE_ASSD_Panel_Reel
+                  if 'R' in self.GetType():
+                     self.panel = UNIQUE_ASSD_Panel_Reel
+                  else :
+                     self.panel = UNIQUE_ASSD_Panel
+              else:
+                  # on attend une valeur d'un type de base (entier,réel,...)
+                  if self.wait_complex():
+                      # on attend un complexe
+                      from uniquecomppanel import UNIQUE_COMP_Panel
+                      self.panel = UNIQUE_COMP_Panel
+                  else:
+                      # on attend un entier, un réel ou une string
+                      from uniquebasepanel import UNIQUE_BASE_Panel
+                      self.panel = UNIQUE_BASE_Panel
+      # cas particulier des fonctions
+      genea = self.get_genealogie()
+      if "VALE" in genea or "VALE_C" in genea:
+         if "DEFI_FONCTION" in genea :
+            from fonctionpanel import FONCTION_Panel
+            self.panel=FONCTION_Panel
+      #---------------------------------------------------------
+      # PN ajout pour lancement de Salome
+      #---------------------------------------------------------
+      if hasattr( self.appli, 'salome' ):
+          import panelsSalome
+
+          self.select_noeud_maille=0
+          self.clef_fonction="SALOME"
+          for i in range(0,len( genea )) :
+             self.clef_fonction=self.clef_fonction+"_"+ genea[i]
+             #if genea[i] == "GROUP_NO" or genea[i] == "GROUP_MA":
+          if "GROUP_NO" in genea[len(genea)-1] or "GROUP_MA" in genea[len(genea)-1]:
+             self.select_noeud_maille=1
+
+          recherche=panelsSalome.dict_classes_salome[self.panel]
+          if hasattr(recherche,self.clef_fonction):
+             self.panel=recherche
+          if self.select_noeud_maille==1 :
+             self.panel=recherche
+
+
+  #-----------------------------------------------
+  #
+  # 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éjà
+  #        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 wait_into(self):
+#      """ Méthode booléenne qui retourne 1 si l'objet pointé par self
+#      prend ses valeurs dans un ensemble discret (into), 0 sinon """
+#      if self.object.definition.into != None :
+#          return 1
+#      else:
+#          return 0
+
+  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 à 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=[]
+      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))
+      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 ...
+  #
+  #---------------------------------------------------
+  # SetText         a priori inutilisee --> commentee
+  # GetIconName
+  # GetText
+  # getval     a  priori inutilisee --> commentee
+  # set_valeur_co
+  # get_sd_avant_du_bon_type
+  # verif        a  priori inutilisee --> commentee
+  # delete_valeur_co
+
+  #def SetText(self, text):
+  #  try:
+  #    value = eval(text)
+  #    self.object.setval(value)
+  #  except:
+  #    pass
+
+  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 à afficher dans l'arbre représentant la valeur de l'objet
+    pointé par self 
+    """
+    text= self.object.GetText()
+    return text
+    
+  #def getval(self):
+  #    return self.object.getval()
+
+  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 verif(self):
+  #    pass
+
+  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' (chaîne de caractères) comme valeur de self :
+             - retourne l'objet associé si on a pu interpréter (entier, réel, ASSD,...)
+             - retourne 'valeur' (chaîne de caractères) sinon
+      """
+      newvaleur=self.eval_val(valeur)
+      return newvaleur,1
+
+  def eval_valeur_BAK(self,valeur):
+      """ Lance l'interprétation de 'valeur' (chaîne 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' (chaîne 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 où on a évalué et où 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 chaîne pour un réel
+      ou de détecter si on fait référence à 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 à 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/InterfaceTK/definition_cata.py b/InterfaceTK/definition_cata.py
new file mode 100644 (file)
index 0000000..156ea48
--- /dev/null
@@ -0,0 +1,462 @@
+# -*- 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
+
+# Modules Eficas
+import Accas
+from Noyau.N_CR import CR
+
+class CATALOGUE:
+    def __init__(self,modules_cata):
+        self.modules_cata = modules_cata # tuple de modules...
+        self.cr = CR()
+        self.state='undetermined'
+        self.entites_attributs = {}
+        self.entites_fils = []
+        self.build_entites_attributs()
+        self.build_entites_fils()
+
+    def build_entites_attributs(self):
+        pass
+        
+    def build_entites_fils(self):
+        niv_types = Accas.NIVEAU(nom="types",label="Liste des types")
+        niv_commandes = Accas.NIVEAU(nom="commandes",label="Liste des commandes")
+        self.entites_fils.append(make_commande_cata(niv_types,self))
+        self.entites_fils.append(make_commande_cata(niv_commandes,self))
+        for module_cata in self.modules_cata:
+            for e in dir(module_cata):
+                obj = getattr(module_cata,e)
+                if isCMD(obj):
+                    self.entites_fils[1].register(make_commande_cata(obj,self.entites_fils[1]))
+                elif type(obj) == types.ClassType:
+                    if issubclass(obj,Accas.ASSD):
+                        self.entites_fils[0].register(TYPE_CATA(obj))
+
+    def init_modif(self):
+        self.state = 'modified'
+        
+    def report(self):
+      """ Classe CATALOGUE
+          Methode pour generation d un rapport de validite
+      """
+      self.cr.purge()
+      self.cr.debut="DEBUT CR validation : " 
+      self.cr.fin="FIN CR validation :"
+      self.state = 'modified'
+      self.isvalid(cr='oui')
+      for fils in self.entites_fils[1].entites :
+        self.cr.add(fils.report())
+      return self.cr
+
+    def isvalid(self,cr='non'):
+        if self.state != 'unchanged':
+            valid=1
+            for fils in self.entites_fils[1].entites_fils:
+                if not fils.isvalid():
+                    valid=0
+                    break
+            self.valid = valid
+            self.state='unchanged'
+        return self.valid
+    
+def make_commande_cata(objet,pere):
+    if isinstance(objet,Accas.OPER):
+        return OPER_CATA(objet,pere,objet.nom)
+    elif isinstance(objet,Accas.PROC):
+        return PROC_CATA(objet,pere,objet.nom)
+    elif isinstance(objet,Accas.MACRO):
+        return MACRO_CATA(objet,pere,objet.nom)
+    elif isinstance(objet,Accas.FORM):
+        return MACRO_CATA(objet,pere,objet.nom)
+    elif isinstance(objet,Accas.NIVEAU):
+        return NIVEAU_CATA(objet,pere,objet.nom)
+    else:
+        print "Erreur dans make_commande_cata : on cherche à évaluer un objet non référencé ",objet
+
+def make_mc_cata(objet,pere,nom=''):
+    if isinstance(objet,Accas.BLOC):
+        return BLOC_CATA(objet,pere,nom)
+    elif isinstance(objet,Accas.FACT):
+        return FACT_CATA(objet,pere,nom)
+    elif isinstance(objet,Accas.SIMP):
+        return SIMP_CATA(objet,pere,nom)
+    else:
+        print "Erreur dans make_mc_cata : on cherche à évaluer un objet non référencé ",objet
+
+class TYPE_CATA:
+    def __init__(self,objet):
+        self.objet = objet
+        self.nom = objet.__name__
+
+    def isvalid(self,cr='non'):
+        return 1
+
+    def get_valeur_attribut(self,nom_attr):
+        if nom_attr == 'nom':return self.nom
+        return None
+   
+class OBJET_CATA:
+    attributs=[]
+    attributs_defauts={}
+    def __init__(self,objet,pere,nom):
+        self.objet = objet
+        self.nom = nom
+        self.pere = pere
+        self.cr = CR()
+        self.state='undetermined'
+        self.entites_fils = []
+        self.entites_attributs = {}
+        self.build_entites_attributs()
+        self.build_entites_fils()
+
+    def __str__(self):
+        s=''
+        s=self.__class__.__name__+' : '+self.nom
+        return s
+    
+    def build_entites_attributs(self):        
+        for attribut in self.attributs:
+            if hasattr(self.objet,attribut):
+                self.entites_attributs[attribut]=ATTR_CATA(attribut,getattr(self.objet,attribut))
+            else:
+                if self.attributs_defauts.has_key(attribut):
+                    self.entites_attributs[attribut]=ATTR_CATA(attribut,self.attributs_defauts[attribut])
+                else:
+                    self.entites_attributs[attribut]=ATTR_CATA(attribut,None)
+
+    def build_entites_fils(self):
+        for k,v in self.objet.entites.items():
+            self.entites_fils.append(make_mc_cata(v,self,nom=k))
+
+    def get_valeur_attribut(self,nom_attr):
+        if nom_attr in self.entites_attributs.keys():
+            return self.entites_attributs[nom_attr].valeur
+        elif nom_attr in self.attributs_defauts.keys():
+            return self.attributs_defauts[nom_attr]
+        elif nom_attr == 'domaine_validité':
+            if self.entites_attributs['into'].valeur != None :
+                return 'discret'
+            else:
+                return 'continu'
+
+    def isvalid(self,cr='non'):
+        if self.state =='unchanged':
+            return self.valid
+        else:
+            valid = 1
+            if hasattr(self,'valid'):
+                old_valid = self.valid
+            else:
+                old_valid = None
+            # on teste self lui-meme
+            if self.nom == '' or self.nom == None : valid=0
+            # on teste les attributs
+            for attribut in self.entites_attributs.values():
+                if not attribut.isvalid() : valid =0
+                break
+            # on teste les fils
+            for fils in self.entites_fils:
+                if not fils.isvalid(): valid = 0
+                break
+        self.valid = valid
+        self.state = 'unchanged'
+        if old_valid:
+            if old_valid != self.valid : self.init_modif_up()
+        return self.valid
+
+    def init_modif_up(self):
+        self.pere.state='modified'
+      
+    def report(self):
+        self.cr.purge()
+        self.cr.debut="Debut "+self.__class__.__name__+' : '+self.nom
+        self.cr.fin = "Fin "+self.__class__.__name__+' : '+self.nom
+        self.isvalid(cr='oui')
+        for attribut in self.entites_attributs.values():
+            self.cr.add(attribut.report())
+        for fils in self.entites_fils :
+            self.cr.add(fils.report())
+        return self.cr
+        
+    def set_valeur_attribut(self,nom_attr,valeur):
+        """
+        Affecte la valeur 'valeur' à l'attribut de nom 'nom-attr'
+        """
+        # il faudra être prudent sur les changements de nom : interdire de changer
+        # le nom d'un mot-clé qui serait utilisé dans une règle ???
+        self.entites_attributs[nom_attr].valeur = valeur
+        
+    def addentite(self,name,pos):
+        """
+        Permet d'ajouter un nouveau fils a self
+        """
+        self.init_modif()
+        if name == 'new_simp':
+            objet = Accas.SIMP(typ=('bidon',))
+        objet_cata = make_mc_cata(objet,self)
+        self.entites_fils.insert(pos,objet_cata)
+        return objet_cata
+
+    def init_modif(self):
+        self.state = 'modified'
+        if hasattr(self,'pere'):
+            self.pere.init_modif()
+
+    def verif_nom(self,cr='non'):
+        """
+        Méthode appelée par EFICAS et ACCAS
+        Booléenne : retourne 1 si l'attribut nom est valide, 0 sinon
+        """
+        if self.entites_attributs['nom'].valeur == '':
+            if cr == 'oui' : self.cr.fatal("L'objet de type %s n'est pas nommé" %self.__class__.__name__)
+            return 0
+        return 1
+    
+    def verif_defaut(self,cr='non'):
+        """
+        Méthode de vérification de validité du défaut
+        """
+        defaut = self.get_valeur_attribut('defaut')
+        if self.get_valeur_attribut('domaine_validite') == 'discret' :
+            if defaut not in self.get_valeur_attribut('into'):
+                if cr == 'oui' : self.cr.fatal("La valeur %s n'est pas autorisée" %str(defaut))
+                return 0
+            return 1
+        else:
+            if defaut == None : return 1
+            typ = self.get_valeur_attribut('type')
+            # on attend un TXM ?
+            if 'TXM' in typ :
+                if type(defaut) == types.StringType : return 1
+            val_min = self.get_valeur_attribut('val_min')
+            val_max = self.get_valeur_attribut('val_max')
+            # on attend un reel ?
+            if 'R' in typ :
+                if type(defaut) == types.StringType:
+                    try :
+                        nb = string.atof(defaut)
+                    except:
+                        nb=None
+                else:
+                    nb = defaut
+                if nb != None :
+                    test = 1
+                    if val_min != '**' : test = (nb >= val_min)
+                    if val_max != '**' : test = test*(nb <= val_max)
+                    if test : return 1
+            # on attend un entier ?
+            if 'I' in typ :
+                if type(defaut)==types.StringType:
+                    try:
+                        nb = string.atoi(defaut)
+                    except:
+                        pass
+                else:
+                    nb = defaut
+                if nb != None :
+                    test = 1
+                    if val_min != '**' : test = (nb >= val_min)
+                    if val_max != '**' : test = test*(nb <= val_max)
+                    if test : return 1
+            # si on passe par là, c'est que l'on n'a pas su évaluer defaut
+            if cr == 'oui' : self.cr.fatal("La valeur %s n'est pas une valeur permise" %str(defaut))
+            return 0
+
+    def verif_val_min(self,cr='non'):
+        """
+        Méthode de vérification de val_min.
+        Booléenne : retourne 1 si val_min est valide, 0 sinon
+        """
+        val_min = self.get_valeur_attribut('val_min')
+        if not val_min :
+            if cr == 'oui' : self.cr.fatal('val_min ne peut valoir None')
+            return 0
+        if val_min == '**': return 1
+        # val_min doit à ce stade être :
+        # - soit un entier ou un réel
+        # - soit une chaîne de caractères représentant un entier ou un réel (provient d'EFICAS)
+        if type(val_min) == types.StringType :
+            try :
+                val_min = string.atoi(val_min)
+            except:
+                try:
+                    val_min = string.atof(val_min)
+                except:
+                    if cr == 'oui' : self.cr.fatal("%s n'est ni un entier ni un réel" %str(val_min))
+                    return 0
+        # A ce stade, val_min doit être un entier ou un réel : on vérifie ...
+        if type(val_min) not in (types.IntType,types.FloatType) :
+            if cr == 'oui' : self.cr.fatal("%s n'est pas d'un type autorisé" %str(val_min))
+            return 0
+        # A ce stade valeur est un entier ou un réel : on peut comparer à val_max
+        val_max = self.get_valeur_attribut('val_max')
+        if val_max == '**' or val_min < val_max : return 1
+        # erreur : val_min est supérieur à val_max !!!
+        if cr == 'oui' : self.cr.fatal("%s n'est pas inférieur à %s" %(str(val_min),str(val_max)))
+        return 0
+
+    def verif_val_max(self,cr='non'):
+        """
+        Méthode de vérification de val_max.
+        Booléenne : retourne 1 si val_max est valide, 0 sinon
+        """
+        val_max = self.get_valeur_attribut('val_max')
+        if not val_max :
+            if cr == 'oui' : self.cr.fatal('val_max ne peut valoir None')
+            return 0
+        if val_max == '**': return 1
+        # val_max doit à ce stade être :
+        # - soit un entier ou un réel
+        # - soit une chaîne de caractères représentant un entier ou un réel (provient d'EFICAS)
+        if type(val_max) == types.StringType :
+            try :
+                val_max = string.atoi(val_max)
+            except:
+                try:
+                    val_max = string.atof(val_max)
+                except:
+                    if cr == 'oui' : self.cr.fatal("%s n'est ni un entier ni un réel" %str(val_max))
+                    return 0
+        # A ce stade, val_max doit être un entier ou un réel : on vérifie ...
+        if type(val_max) not in (types.IntType,types.FloatType) :
+            if cr == 'oui' : self.cr.fatal("%s n'est pas d'un type autorisé" %str(val_max))
+            return 0
+        # A ce stade valeur est un entier ou un réel : on peut comparer à val_max
+        val_min = self.get_valeur_attribut('val_min')
+        if val_min == '**' or val_min < val_max : return 1
+        # erreur : val_min est supérieur à val_max !!!
+        if cr == 'oui' : self.cr.fatal("%s n'est pas supérieur à %s" %(str(val_max),str(val_min)))
+        return 0
+    
+class OPER_CATA(OBJET_CATA):
+    attributs = ['ang','docu','fr','niveau','nom','op','op_init','reentrant','regles','repetable','sd_prod']
+  
+class PROC_CATA(OBJET_CATA):
+    attributs = ['ang','docu','fr','niveau','nom','op','op_init','regles','repetable']
+
+class MACRO_CATA(OBJET_CATA):
+    attributs = ['ang','docu','fr','niveau','nom','op','op_init','reentrant','regles','repetable','sd_prod']
+    
+class BLOC_CATA(OBJET_CATA):
+    attributs = ['ang','condition','docu','fr','nom','regles']
+
+class FACT_CATA(OBJET_CATA):
+    attributs=['ang','defaut','docu','fr','max','min','nom','regles','statut']
+
+class SIMP_CATA(OBJET_CATA):
+    attributs=['ang','defaut','docu','fr','homo','into','max','min','nom','position','statut','type','val_min','val_max']
+    attributs_defauts={'ang':'','defaut':None,'fr':'','homo':1,'into':None,'max':1,'min':1,'nom' : '','position':'local',
+                       'regles':None,'statut':'f','type':None,'val_min':'**','val_max':'**','docu':''}
+                
+    def build_entites_fils(self):
+        pass
+
+    def isvalid(self,cr='non'):
+        """
+        Mde appelpar l'externe (EFICAS et ACCAS).
+        Boolne : retourne 1 si l'objet est valide, 0 sinon
+        """
+        if self.state == 'unchanged':
+            return self.valid
+        else:
+            valid = 1
+            valid = valid*self.verif_nom(cr=cr)
+            valid = valid*self.verif_defaut(cr=cr)
+            valid = valid*self.verif_val_min(cr=cr)*self.verif_val_max(cr=cr)
+            if hasattr(self,'valid'):
+                old_valid = self.valid
+            else:
+                old_valid = None
+            self.valid = valid
+            self.state='unchanged'
+            if old_valid :
+                if old_valid != self.valid : self.init_modif_up()
+            return self.valid
+
+class NIVEAU_CATA(OBJET_CATA):
+  def __init__(self,objet,pere,nom):
+    self.pere = pere
+    self.nom = nom
+    self.state = 'undetermined'
+    self.cr = CR()
+    self.objet = objet
+    self.entites_fils=[]
+    self.entites_attributs = {}
+
+  def register(self,fils):
+    """ 
+        Enregistre la commande 굡pe :
+         - si editmode = 0 : on est en mode relecture d'un fichier de commandes
+         auquel cas on ajoute etape ࡬a fin de la liste self.etapes
+         - si editmode = 1 : on est en mode ajout d'굡pe depuis eficas auquel cas
+         cette mode ne fait rien, c'est addentité enregistre etape à¡¬a bonne place
+         dans self.etapes 
+    """
+    self.entites_fils.append(fils)
+
+  def unregister(self,etape):
+    self.entites_fils.remove(etape)
+
+  def isvalid(self,cr='non'):
+    """ Mode boolne qui retourne 0 si le niveau est invalide, 1 sinon """
+    if self.state == 'unchanged':
+        return self.valid
+    else:
+        valid = 1
+        if len(self.entites_fils) == 0:
+            #valid = self.Accas.valide_vide
+            valid = 1
+        else:
+            for commande in self.entites_fils :
+                if hasattr(commande,'isvalid'):
+                    if not commande.isvalid() :
+                        valid = 0
+                        break
+                else:
+                    print str(commande)," n'a pas de methode isvalid"
+        if hasattr(self,'valid'):
+            old_valid = self.valid
+        else:
+            old_valid = None
+        self.valid = valid
+        self.state='unchanged'
+        if old_valid:
+            if old_valid != self.valid : self.init_modif_up()
+        return self.valid
+            
+
+class ATTR_CATA(OBJET_CATA):
+    def __init__(self,nom,valeur=None):
+        self.nom = nom
+        self.valeur = valeur
+        self.cr = CR()
+        self.state='undetermined'
+        self.entites_attributs={}
+        self.entites_fils=()
+
+    def isvalid(self,cr='non'):
+        return 1
+
+def isCMD(cmd):
+   return isinstance(cmd,Accas.OPER) or isinstance(cmd,Accas.PROC) or isinstance(cmd,Accas.MACRO) or isinstance(cmd,Accas.FORM)
+
diff --git a/InterfaceTK/eficas.py b/InterfaceTK/eficas.py
new file mode 100644 (file)
index 0000000..caf47fb
--- /dev/null
@@ -0,0 +1,143 @@
+# -*- 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 contient la classe EFICAS qui est l'application
+    proprement dite. Elle est dérivée de la classe APPLI
+"""
+# Modules Python
+import string
+from Tkinter import Label
+import Pmw
+import traceback
+
+# Modules Eficas
+from widgets import showerror
+from widgets import askopenfilename
+import patches
+import appli
+from widgets import Fenetre
+
+class EFICAS(appli.APPLI):
+
+  try:
+     from prefs import appli_composants
+  except:
+     appli_composants=['readercata','bureau','browser','options']
+
+  def get_texte_infos(self):
+     texte=appli.APPLI.get_texte_infos(self)
+     texte = texte + 'Catalogue utilisé : %s\n' %  self.bureau.fic_cata
+     return texte
+
+  def exitEFICAS(self):
+     self.bureau.exitEFICAS()
+
+  def getBureau(self):
+      return self.bureau
+      
+  def browse(self,result):
+      if result == 'Browse':
+        self.ulfile = askopenfilename(parent=self.dialog.component('hull'),title="Choix fichier :")
+        self._ulfile.setentry(self.ulfile)
+      elif result == 'OK':
+        self.ulfile = self._ulfile.get()
+        # On utilise le convertisseur défini par format_fichier
+        source=self.get_source(self.ulfile)
+        if source:
+           # On a réussi à convertir le fichier self.ulfile
+           self.dialog.deactivate(result)
+           self.text=source
+        else:
+           # Une erreur a été rencontrée
+           self.text=''
+      elif result == 'Cancel':
+        self._ulfile.setentry('')
+        self.dialog.deactivate(result)
+        self.ulfile = None
+        self.text=""
+
+  def get_file(self,unite=None,fic_origine = ''):
+      """ 
+          Retourne le nom du fichier correspondant a l unite logique unite (entier)
+      """
+      if unite :
+          titre = "Choix unite %d " %unite
+      else:
+          titre = "Choix d'un fichier de poursuite"
+      self.dialog=Pmw.Dialog(self.top,
+                             title = titre,
+                             buttons = ('OK', 'Browse','Cancel'),
+                             defaultbutton='OK',
+                             command=self.browse,
+                             )
+      self.dialog.withdraw()
+      if 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
+      else:
+          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'
+      if self.test == 1: raise Exception("Erreur: "+texte)
+      w = Label(self.dialog.interior(),
+                text = texte)
+      w.pack(padx = 10, pady = 10)
+      if unite != None :
+          labeltexte = 'Fichier pour unite %d :' % unite
+      else:
+          labeltexte = 'Fichier à poursuivre :'
+      self._ulfile=Pmw.EntryField(self.dialog.interior(),
+                                  labelpos = 'w',
+                                  label_text = labeltexte,
+                                  )
+      self._ulfile.pack(fill='x', expand=1, padx=10, pady=5)
+      self._ulfile.component('entry').focus_set()
+      self.dialog.activate(geometry='centerscreenalways')
+      return self.ulfile,self.text
+
+  def get_source(self,file):
+      import convert
+      format=self.format_fichier.get()
+      # 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 à la conversion")
+            Fenetre(self,
+                    titre="compte-rendu d'erreurs, EFICAS ne sait pas convertir ce fichier",
+                    texte = str(p.cr)).wait()
+            return text
+         return text
+      else:
+         # Il n'existe pas c'est une erreur
+         self.affiche_infos("Type de fichier non reconnu")
+         showerror("Type de fichier non reconnu","EFICAS ne sait pas ouvrir ce type de fichier")
+         return None
+
+  def affiche_texte(self,entete,texte):
+      """Cette methode ouvre une fenetre modale dans laquelle on affiche un texte
+      """
+      self.affiche_infos(entete)
+      f=Fenetre(self, titre=entete, texte = texte)
+      f.wait()
+
diff --git a/InterfaceTK/eficas_go.py b/InterfaceTK/eficas_go.py
new file mode 100644 (file)
index 0000000..81e929f
--- /dev/null
@@ -0,0 +1,59 @@
+# -*- 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
+import Tkinter
+
+# Modules Eficas
+from Aster 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
+
+import styles
+from Editeur import import_code
+from InterfaceTK import splash
+from Editeur import session
+
+def lance_eficas(code=None,fichier=None):
+    """
+        Lance l'appli EFICAS
+    """
+    # Analyse des arguments de la ligne de commande
+    options=session.parse(sys.argv)
+    code=options.code
+
+    root = Tkinter.Tk()
+    splash.init_splash(root,code=code,titre="Lancement d'EFICAS pour %s" %code)
+    splash._splash.configure(text="Chargement d'EFICAS en cours.\n Veuillez patienter ...")
+    import eficas
+    eficas.EFICAS(root,code=code,ihm="TK")
+
+    root.mainloop()
+
diff --git a/InterfaceTK/eficas_test.py b/InterfaceTK/eficas_test.py
new file mode 100644 (file)
index 0000000..2a5230c
--- /dev/null
@@ -0,0 +1,105 @@
+# -*- 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 patentier l'utilisateur
+"""
+# Modules Python
+import sys
+import Tkinter
+
+# Modules Eficas
+from Editeur import import_code
+from Editeur import session
+
+def lance_eficas(code,fichier=None):
+    """
+        Lance l'appli EFICAS
+    """
+    options=session.parse(sys.argv)
+    root = Tkinter.Tk()
+    import eficas
+    if fichier :
+        a=eficas.EFICAS(root,code=code,fichier = fichier,test=1)
+        bureau=a.getBureau()
+    else:
+        eficas.EFICAS(root,code=code)
+
+    print bureau.JDC.report()
+    bureau.closeJDC()
+
+def duplique_fichier(code,fichier=None,root=None):
+    print code
+    print fichier
+    if root == None :
+       root = Tkinter.Tk()
+    import eficas
+    import convert
+    import generator
+    import Editeur.utils
+    import string
+
+    if fichier != None :
+       options=session.parse(sys.argv+[fichier])
+    else :
+       options=session.parse(sys.argv)
+
+    appli=eficas.EFICAS(root,code=code,fichier = fichier,test=1)
+    format='homard'
+    if convert.plugins.has_key(format):
+       p=convert.plugins[format]()
+       p.readfile(fichier)
+       text=p.convert('exec',appli)
+       print text
+       text2=convertir(text)
+       print text2
+       cata=appli.readercata.cata
+       J=cata[0].JdC(procedure=text2,cata=cata)
+       J.analyse()
+       fileName=fichier+"_init"
+       if generator.plugins.has_key(format):
+          g=generator.plugins[format]()
+          jdc_formate=g.gener(J,format='beautifie')
+          jdc_fini = string.replace(jdc_formate,'\r\n','\n')
+          utils.save_in_file(fileName+".comm",jdc_fini,None)
+
+def convertir(texte):
+    import re
+    dict_change={"FICHIER_MED_MAILLAGE_N=":"FICHIER_MED_MAILLAGE_NP1","NOM_MED_MAILLAGE_N=":"NOM_MED_MAILLAGE_NP1"}
+    for mot in dict_change.keys():
+        if( re.search(mot,texte)):
+          indicenouveau=re.search(mot,texte).end()
+          indicefinnouveau= texte.find(",",indicenouveau)
+          avant=dict_change[mot]
+          if( re.search(avant,texte)):
+             indiceancien=re.search(avant,texte).end()+1
+             indicefinancien= texte.find(",",indiceancien)
+             valeur=texte[indiceancien:indicefinancien]
+             texte=texte[0:indicenouveau]+valeur+texte[indicefinnouveau:]
+    liste_mot_clef_None=['CRIT_RAFF_ABS','CRIT_RAFF_REL','CRIT_RAFF_PE','CRIT_DERA_ABS','CRIT_DERA_REL','CRIT_DERA_PE','NITER','NOM_MED_MAILLAGE_NP1','FICHIER_MED_MAILLAGE_NP1']
+
+    for mot in liste_mot_clef_None:
+        if( re.search(mot,texte)):
+           indice=re.search(mot,texte).end()+1
+           indicefin= texte.find(",",indice)
+           texte=texte[0:indice]+"None"+texte[indicefin:]
+    return texte
+        
diff --git a/InterfaceTK/faq.py b/InterfaceTK/faq.py
new file mode 100644 (file)
index 0000000..afa09fe
--- /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.
+#
+#
+# ======================================================================
+"""
+   Ce module sert a afficher le texte du FAQ EFICAS
+   et à attendre l'acquittement par l'utilisateur
+"""
+# Modules Python
+import os
+import Pmw
+from Tkinter import END
+
+# Modules Eficas
+from Aster import prefs
+from InterfaceTK import fontes
+
+class FAQ:
+   def __init__(self,parent):
+      self.parent=parent
+      self.Dialog = Pmw.Dialog(parent,
+                               buttons=('Lu',),
+                               title="FAQs et limitations d'EFICAS",
+                               command = self.lu_FAQ)
+      txt = open(os.path.join(prefs.INSTALLDIR,'Editeur','faqs.txt'),'r').read()
+      Texte = Pmw.ScrolledText(self.Dialog.interior(),
+                               text_font=fontes.standard)
+      Texte.insert(END,txt)
+      Texte.pack(expand=1,fill='both')
+      self.Dialog.activate(geometry = 'centerscreenalways')
+
+   def lu_FAQ(self,event=None):
+      self.Dialog.destroy()
+
+def affiche(parent):
+   FAQ(parent)
diff --git a/InterfaceTK/faqs.txt b/InterfaceTK/faqs.txt
new file mode 100755 (executable)
index 0000000..b087c34
--- /dev/null
@@ -0,0 +1,46 @@
+
+-------------------------------------------------------------------------------------------------------------
+                        FAQs et Limitations d'EFICAS
+-------------------------------------------------------------------------------------------------------------
+
+
+1. Mots réservés :
+
+        Tous les mots du langage Python sont des mots réservés.
+        On ne peut donc pas appeler une variable ou un concept 'fin' ou 'dir'
+        Pour la liste complète de ces mots-clés, veuillez vous référer à la 
+        documentation Python
+
+2. Concepts réentrants :
+
+        Ne pas indiquer par un '&' devant son nom qu'un concept est utilisé comme
+        concept réentrant. En effet EFICAS le sait !
+
+3. Carte commentaire :
+
+        La carte commentaire est désormais le '#' (dièse) au lieu du '%' (pourcent)
+   Les commentaires sont gérés comme des objets de même niveau que les
+   commandes ; il n'est plus possible de placer des commentaires "dans"
+   une commande. Attention, lors de la traduction d'un fichier de version 5
+   en 6, les commentaires "dans" les commandes seront perdus.
+
+4. Nommer le concept produit par un opérateur :
+
+        Vous ne pouvez nommer le concept produit d'un opérateur que lorsque
+        celui-ci aura été entièrement et correctement rempli.
+
+5. Règle de rémanence dans les mots-clés facteurs répétés :
+
+        La règle de rémanence qui permettait pour certains mots-clés facteurs
+        et pour certains de leurs mots-clés simples de ne pas répeter la valeur
+        de ces derniers dans toutes les occurrences du mot-clé facteur n'est pas 
+        connue d'EFICAS.
+        En conséquence, vous devez répéter les mots-clés simples concernés dans 
+        toutes les occurrences des mots-clés facteurs.
+
+6. Besoin d'aide ?
+        
+        La documentation d'utilisation d'EFICAS a pris un peu de retard sur le produit ...
+        Néanmoins, vous disposez sur la plupart des panneaux contextuels ( les panneaux à
+        droite de l'arbre) d'une aide en ligne que vous pouvez activer en maintenant le 
+        bouton droit de votre souris enfoncé.
diff --git a/InterfaceTK/fenetre_mc_inconnus.py b/InterfaceTK/fenetre_mc_inconnus.py
new file mode 100644 (file)
index 0000000..35b118a
--- /dev/null
@@ -0,0 +1,223 @@
+# -*- 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 *
+import copy
+
+# Modules Eficas
+from centerwindow import centerwindow
+
+class fenetre_mc_inconnus :
+    """
+       Cette classe sert à construire la fenêtre qui apparaît dans EFICAS 
+       lorsque des mots-clés inconnus ont été trouvés dans le fichier de 
+       commandes que l'on est en train de lire
+    """
+    def __init__(self,l_mc):
+       self.l_mc = l_mc
+       self.fenetre = Toplevel()
+       self.fenetre.withdraw()
+       self.fenetre.geometry("400x400+0+0")
+       self.fenetre.title("Mots-clés inconnus dans le fichier de commandes")
+       self.init()
+       self.init_frames()
+       self.init_label()
+       self.init_liste_mc()
+       self.init_boutons()
+       centerwindow(self.fenetre)
+       self.fenetre.deiconify()
+
+    def init(self) :
+       """
+       Initialise les structures de données
+       """
+       self.new_l_mc = []
+       for mc in self.l_mc :
+           self.new_l_mc.append(copy.copy(mc))
+       self.mc_courant = None
+       self.var_quit = IntVar(0)
+       self.entry_courante = None
+               
+    def init_frames(self):
+       """
+       Création des 2 frames devant contenir le label et la liste des MC inconnus 
+       """
+       self.frame1 = Frame(self.fenetre)
+       self.frame2 = Frame(self.fenetre)
+       self.frame3 = Frame(self.fenetre)
+       self.frame1.place(relx=0,rely=0,relheight=0.2,relwidth=1)
+       self.frame2.place(relx=0,rely=0.2,relheight=0.6,relwidth=1)
+       self.frame3.place(relx=0,rely=0.8,relheight=0.2,relwidth=1)
+    
+    def init_label(self):
+       """
+       Affichage du label dans la zone concernée
+       """
+       txt = " Un ou plusieurs mots-clés inconnus ont été trouvés dans le fichier de commandes."
+       #txt = txt + "En cliquant sur leur nom, vous pourrez soit corriger l'orthographe soit supprimer ce mot-clé"
+       self.fenetre.update_idletasks()
+       Label(self.frame1,
+             text = txt,
+             wraplength = int(self.frame1.winfo_width()*0.8),
+             justify = 'center').place(relx=0.5,rely=0.5,anchor='center')   
+    
+    
+    def init_liste_mc(self):
+       """
+       Affiche les mots-clés à modifier ou supprimer  
+       """
+       i=0
+       self.widgets=[]
+       for mc in self.l_mc :
+           # mc est une liste :
+           # mc contient comme premiers arguments l'étape et éventuellement les blocs, mcfact ...
+           # et contient comme 2 derniers éléments le nom du mot-clé et sa valeur
+           path_mc = self.get_path(mc[0:-2])
+           nom_mc  = mc[-2]
+           lab=Label(self.frame2,text = path_mc)
+           lab.grid(row=i,column=1,sticky=W)
+           e = Entry(self.frame2)
+           e.grid(row=i,column=0,sticky=W)
+           e.insert(END,nom_mc)
+           #e.bind("<Button-1>",lambda event,en=e,m=mc,s=self : s.select_mc(m,en))
+           #e.bind("<Return>",lambda e,s=self : s.modifie_mc())
+           e.configure(relief='flat',state='disabled')
+           self.widgets.append((e,lab))
+           i=i+1
+
+    def init_boutons(self):
+        """
+        Construit les boutons Modifier,Supprimer et Fermer 
+        Les deux premiers sont inactifs tant qu'aucun mot-clé n'est sélectionné
+        """
+        self.b_mod = Button(self.frame3,
+                            text = "Modifier",
+                            disabledforeground = 'grey35',
+                            state='disabled',
+                            command = self.modifie_mc)
+        self.b_sup = Button(self.frame3,
+                            text = "Supprimer",
+                            disabledforeground = 'grey35',
+                            state='disabled',
+                            command = self.supprime_mc)
+        self.b_quit = Button(self.frame3,
+                            text = "Fermer",
+                            command = self.quit)
+        #self.b_mod.place(relx=0.25,rely=0.5,anchor='center')
+        #self.b_sup.place(relx=0.50,rely=0.5,anchor='center')
+        #self.b_quit.place(relx=0.75,rely=0.5,anchor='center')
+        self.b_quit.place(relx=0.50,rely=0.5,anchor='center')
+                                
+    def wait_new_list(self):
+        """
+        Cette méthode rend cette toplevel bloquante.
+        Dès que la variable var_quit est modifiée, on continue l'exécution de cette
+        méthode (et on quitte)
+        """
+        self.fenetre.wait_variable(self.var_quit)
+        self.fenetre.destroy()
+        return self.new_l_mc
+                           
+    def get_path(self,l_o):
+        """
+        Construit la chaîne de caractère contenant le chemin d'accès complet du mot-clé
+        """
+        txt = ''
+        for o in l_o :
+           txt = txt + o.nom+'/'
+        # on enlève le dernier slash en trop
+        txt = txt[0:-1]
+        return txt    
+    
+    def select_mc(self,mc,entry):
+        """
+        Enregistre le mot-clé passé en argument comme mot-clé courant
+        Active les boutons Modifier et Supprimer
+        """
+        self.desactive_entry()
+        self.mc_courant     = mc
+        self.entry_courante = entry
+        self.active_boutons()
+        self.active_entry()
+
+    def modifie_mc(self):
+        """
+        Modifie le nom du mot-clé en prenant la nouvelle valeur lue dans entry_courante
+        """
+        new_nom_mc = self.entry_courante.get()
+        index = self.l_mc.index(self.mc_courant)
+        new_mc = self.new_l_mc[index]
+        new_mc[-2] = new_nom_mc
+        objet_pere = self.mc_courant[-3]
+        
+        self.desactive_boutons()
+        self.desactive_entry()
+
+    def supprime_mc(self):
+        """
+        Supprime le mot-clé courant de la liste
+        """
+        index = self.l_mc.index(self.mc_courant)
+        self.new_l_mc[index] = None
+        e,lab=self.widgets[index]
+        e.grid_remove()
+        lab.grid_remove()
+        self.desactive_boutons()
+        self.desactive_entry()        
+        
+    def desactive_boutons(self):
+        """
+        Désactive les boutons Modifier et Supprimer
+        """
+        self.b_mod.configure(state='disabled')
+        self.b_sup.configure(state='disabled')
+                
+    def active_boutons(self):
+        """
+        Active les boutons Modifier et Supprimer
+        """
+        self.b_mod.configure(state='normal')
+        self.b_sup.configure(state='normal')
+
+    def desactive_entry(self):
+        """
+        Désactive l'entry courante si elle existe
+        """
+        if self.entry_courante :
+           self.entry_courante.configure(state='disabled',relief='flat')
+           
+    def active_entry(self):
+        """
+        Active l'entry courante si elle existe
+        """
+        if self.entry_courante :
+           self.entry_courante.configure(state='normal',relief='sunken')
+                      
+    def quit(self):
+        """
+        Permet de fermer la fenêtre
+        """
+        self.var_quit.set(1)
+
+if __name__ == '__main__':
+   fenetre_mc_inconnus(('toto','titi'))
diff --git a/InterfaceTK/fonctionpanel.py b/InterfaceTK/fonctionpanel.py
new file mode 100644 (file)
index 0000000..7b1646f
--- /dev/null
@@ -0,0 +1,293 @@
+# -*- 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 Tkinter import *
+import Pmw
+from copy import copy,deepcopy
+import traceback
+
+# Modules Eficas
+from Editeur import Objecttreeitem
+from Aster import prefs
+import panels
+import images
+from widgets import ListeChoix
+from widgets import FenetreDeSelection
+from widgets import askopenfilename
+from widgets import showinfo
+
+from Noyau.N_CR import justify_text
+from Editeur.utils import substract_list
+from plusieursbasepanel import PLUSIEURS_BASE_Panel
+
+
+class FONCTION_Panel(PLUSIEURS_BASE_Panel):
+  def makeValeurPage(self,page):
+      """
+      Crée la page de saisie d'une liste de valeurs à priori quelconques,
+      cad qui ne sont  pas à choisir dans une liste prédéfinie
+      """
+      genea=self.node.item.get_genealogie()
+      if "VALE" in genea:
+        self.nb_valeurs=2
+      if "VALE_C" in genea:
+        self.nb_valeurs=3
+      # On récupère la bulle d'aide du panneau, l'objet, l'aide,min et max (cardinalité de la liste),
+      # et la liste des valeurs déjà affectées à l'objet courant
+      bulle_aide=self.get_bulle_aide()
+      objet_mc = self.node.item.get_definition()
+      aide = self.get_aide()
+      aide = justify_text(texte=aide)
+      min,max = self.node.item.GetMinMax()
+      l_valeurs = self.node.item.GetListeValeurs()
+      l2_valeurs=self.decoupeListeValeurs(l_valeurs)
+
+      # création des frames globales
+      self.frame1 = Frame(page,relief='groove',bd=2)
+      self.frame2 = Frame(page)
+      self.frame1.place(relx=0.,rely=0.,relwidth=1.,relheight=0.85)
+      self.frame2.place(relx=0.,rely=0.85,relwidth=1,relheight=0.15)
+      self.frame_right = Frame(self.frame1)
+      self.frame_right.place(relx=0.35,rely=0.,relwidth=0.65,relheight=1.)
+
+      # création des frames internes
+      self.frame_valeurs = Frame(self.frame1)
+      self.frame_valeurs.place(relx=0.02,rely=0.05,relwidth=0.35,relheight=0.95)
+      self.frame_boutons_fleches = Frame(self.frame_right)
+      self.frame_boutons_fleches.place(relx=0.,rely=0.2,relwidth=0.2,relheight=0.5)
+      self.frame_choix = Frame(self.frame_right)
+      self.frame_choix.place(relx=0.2,rely=0.2,relwidth=0.7,relheight=0.5)
+      self.frame_aide = Frame(self.frame_right)
+      self.frame_aide.place(relx=0.1,rely=0.7,relwidth=0.8,relheight=0.3)
+      self.frame_boutons = Frame(self.frame2)
+      self.frame_boutons.place(relx=0.35,rely=0.,relwidth=0.5,relheight=1.)
+      for fram in (self.frame1,self.frame2,self.frame_right,self.frame_valeurs,
+                 self.frame_boutons_fleches,self.frame_choix,self.frame_aide,self.frame_boutons):
+          fram.bind("<Button-3>",lambda e,s=self,a=bulle_aide : s.parent.appli.affiche_aide(e,a))
+          fram.bind("<ButtonRelease-3>",self.parent.appli.efface_aide)
+
+      # création des objets dans les frames
+      liste_commandes_valeurs = (("<Button-1>",self.selectValeur),
+                                 ("<Button-3>",self.deselectValeur),
+                                 ("<Double-Button-1>",self.afficheValeurListe))
+      self.Liste_valeurs = ListeChoix(self,self.frame_valeurs,l2_valeurs,liste_commandes = liste_commandes_valeurs,
+                                      titre="Valeur(s) actuelle(s)")
+
+      # Création de l'entry ou de la liste des SD
+      self.label = Label(self.frame_choix,text="Valeur :")
+      self.make_entry(frame = self.frame_choix,command = self.add_double_valeur_plusieurs_base)
+      self.label.place(relx=0.05,rely=0.5)
+
+      # Création d'un bouton "Importer ..." sur le panel.
+      bouton_valeurs_fichier = Button(self.frame_choix,
+                                      text="Importer ...",
+                                      command=self.select_in_file)
+      bouton_valeurs_fichier.place(relx=0.28,rely=0.7,relwidth=0.6)
+      self.ajout_valeurs = None
+
+      # boutons Ajouter et Supprimer
+      self.bouton_add = Button(self.frame_boutons_fleches,
+                          image = images.get_image('arrow_left'),
+                          command = self.add_double_valeur_plusieurs_base)
+      self.bouton_sup = Button(self.frame_boutons_fleches,
+                          image = images.get_image('arrow_right'),
+                          command = self.sup_valeur_sans_into)
+      self.bouton_add.place(relx=0.3,rely=0.35)
+      self.bouton_sup.place(relx=0.3,rely=0.65)
+      # affichage de l'aide
+      self.frame_aide.update()
+      self.aide = Label(self.frame_aide,
+                        text = aide,
+                        justify='center',
+                        anchor='center',
+                        wraplength=int(self.frame_aide.winfo_width()*0.8))
+      self.aide.place(relx=0.5,rely=0.5,anchor='center',relwidth=1)
+      self.Liste_valeurs.affiche_liste()
+      # boutons Accepter et Annuler
+      self.bouton_accepter = Button(self.frame_boutons,
+                               text='Valider',
+                               command = lambda s=self,m=min,M=max : s.accepte_modifs_valeur_recolle(m,M))
+      self.bouton_annuler = Button(self.frame_boutons,
+                              text = 'Annuler',
+                              command = self.annule_modifs_valeur)
+      for but in (self.bouton_accepter,self.bouton_annuler):
+          but.pack(side='left',padx=4)
+
+
+  def afficheValeurListe(self,name):
+      self.display_valeur(name)
+
+  def decoupeListeValeurs(self,liste):
+      #decoupe la liste des valeurs en n ( les x puis les y)
+      nb=self.nb_valeurs
+      l_valeurs=[]
+      if (len(liste)%nb != 0):
+          message="La cardinalité n'est pas correcte, la dernière valeur est ignorée"
+          showinfo("Problème",message)
+      for i in range(len(liste)/nb) :
+          if (nb==2):
+              t=(liste[i*nb], liste[i*nb+1])
+          else:
+              t=(liste[i*nb], liste[i*nb+1], liste[i*nb+2])
+          l_valeurs.append(t)
+      return l_valeurs
+
+
+  def accepte_modifs_valeur_recolle(self,min,max):
+      l_valeurs=[]
+      l1_valeurs = self.Liste_valeurs.get_liste()
+      for val in l1_valeurs :
+          for item in val :
+             l_valeurs.append(item) 
+      self.accepte_modifs_valeur(min,max,l_valeurs)
+
+
+  def add_double_valeur_plusieurs_base(self):
+      # on verifie qu'il s agit bien d un tuple
+      # on enleve les parentheses eventuelles
+      #doublevaleur_entree,validite,commentaire=self.get_valeur_double()
+      doublevaleur_entree= self.entry.get()
+      try:
+        if doublevaleur_entree[0]=='(' :
+           doublevaleur_entree=doublevaleur_entree[1:-1]
+        if doublevaleur_entree[-1]==')' :
+           doublevaleur_entree=doublevaleur_entree[0:-2]
+        val1=doublevaleur_entree.split(',')[0] 
+        val2=doublevaleur_entree.split(',')[1] 
+        saisie=(val1,val2)
+        if (self.nb_valeurs==3):
+            val3=doublevaleur_entree.split(',')[2] 
+            saisie=(val1,val2,val3)
+        self.entry.delete(0,END)
+      except :
+        commentaire = "%s n est pas un tuple de la forme (x,y)" %`doublevaleur_entree`
+        if (self.nb_valeurs==3):
+            commentaire = "%s n est pas un tuple de la forme (x,y,z)" %`doublevaleur_entree`
+        self.parent.appli.affiche_infos(commentaire)
+        return
+
+      # et seulement d un tuple
+      try:
+        val=doublevaleur_entree.split(',')[self.nb_valeurs]
+        commentaire = "%s n est pas un tuple de la forme (x,y)" %`doublevaleur_entree`
+        if (self.nb_valeurs==3):
+            commentaire = "%s n est pas un tuple de la forme (x,y,z)" %`doublevaleur_entree`
+        self.parent.appli.affiche_infos(commentaire)
+        self.parent.appli.affiche_infos(commentaire)
+        return
+      except :
+        # c est la le cas normal
+        pass
+
+      # on verifie la validite des valeurs sont correctes
+      valeur,validite=self.node.item.eval_valeur(saisie)
+      if not validite :
+        commentaire = "impossible d'évaluer : %s " %`doublevaleur_entree`
+        self.parent.appli.affiche_infos(commentaire)
+        return
+
+      # on verifie la validite de la liste
+      liste=[]
+      l1_valeurs = self.Liste_valeurs.get_liste()
+      for val in l1_valeurs :
+          for item in val :
+             liste.append(item) 
+      validite_liste=self.node.item.valide_liste_partielle(valeur[0],liste)
+      if not validite_liste:
+        commentaire = "impossible d'ajouter %s a la liste " %`doublevaleur_entree`
+        self.parent.appli.affiche_infos(commentaire)
+        return
+      # liste a deja ete modifiee par l appel precedent a valide_liste_partielle 
+      # et contient deja valeur[0]
+      validite_liste=self.node.item.valide_liste_partielle(valeur[1],liste)
+      if not validite_liste:
+        commentaire = "impossible d'ajouter %s a la liste " %`doublevaleur_entree`
+        self.parent.appli.affiche_infos(commentaire)
+        return
+     
+      # si une valeur est selectionnee on insere apres 
+      # sinon on ajoute la valeur à la fin
+      if (self.Liste_valeurs.selection != None):
+         ligne=self.Liste_valeurs.cherche_selected_item()
+         if self.nb_valeurs==2:
+            l1_valeurs.insert(ligne,(valeur[0],valeur[1]))
+         else :
+            l1_valeurs.insert(ligne,(valeur[0],valeur[1],valeur[2]))
+      else :
+         if self.nb_valeurs==2:
+            l1_valeurs.append((valeur[0],valeur[1]))
+         else :
+            l1_valeurs.append((valeur[0],valeur[1],valeur[2]))
+      i = 0
+      while i < self.nb_valeurs : 
+         self.set_valeur_texte(saisie[i])
+         i=i+1
+      self.Liste_valeurs.put_liste(l1_valeurs)
+      self.Liste_valeurs.affiche_liste()
+
+
+  def display_valeur(self,val=None):
+      """
+      Affiche la valeur passée en argument dans l'entry de saisie.
+      Par défaut affiche la valeur du mot-clé simple
+      Doit être redéfinie pour un pb avec les parametres dans un tuple
+      """
+      if not val :
+          valeur = self.node.item.object.getval()
+      else:
+          valeur = val
+      if not valeur : return
+
+      try:
+        affiche="("
+        separe=""
+        for val in valeur:
+            affiche=affiche+separe+str(val)
+            separe=","
+        affiche=affiche+")"
+        self.entry.delete(0,END)
+        self.entry.insert(0,affiche)
+      except :
+        self.entry.delete(0,END)
+
+# Surcharge de select in file pour prendre en compte la saisie de tuple
+  def select_in_file(self):
+      """ Permet d'ouvrir un fichier choisi par l'utilisateur. """
+      nom_fichier = askopenfilename(title="Choix fichier :")
+
+      if not nom_fichier:
+          return
+
+      try:
+          f = open(nom_fichier, "rb")
+          selection_texte = f.read()
+          f.close()
+          self.add_double_valeur_plusieurs_base = FenetreDeSelection(self,
+                                                  self.node.item,
+                                                  self.parent.appli,
+                                                  titre="Sélection de valeurs",
+                                                  texte=selection_texte,
+                                                  cardinal = self.nb_valeurs)
+      except:
+          traceback.print_exc()
+          showinfo("Erreur de fichier","impossible d'ouvir le fichier "+nom_fichier)
+
diff --git a/InterfaceTK/fontes.py b/InterfaceTK/fontes.py
new file mode 100644 (file)
index 0000000..8e15892
--- /dev/null
@@ -0,0 +1,36 @@
+# -*- 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.
+#
+#
+# ======================================================================
+standard = ("Times",10)
+standard_italique = ("Times",10,'italic')
+standard_gras = ("Times",10,'bold')
+standard_gras_souligne = ("Times",10,'bold','underline')
+
+canvas = ('times',8)
+canvas_italique = ('times',8,'italic')
+canvas_gras = ("Times",8,'bold')
+canvas_gras_italique = ("Times",10,'bold','italic')
+
+standard12 = ("Times",12)
+standard12_gras = ("Times",12,'bold')
+standard12_gras_italique = ( "times",12,'bold','italic')
+
+standardcourier10 = ("Courier",10)
+
diff --git a/InterfaceTK/images.py b/InterfaceTK/images.py
new file mode 100644 (file)
index 0000000..08401ff
--- /dev/null
@@ -0,0 +1,68 @@
+# -*- 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 joue le role de cache pour les images stockées
+    dans le repertoire ICONDIR
+"""
+
+import os
+import Tkinter
+
+if __name__ == '__main__':
+   # Programme de test
+   import sys
+   import images
+   root=Tkinter.Tk()
+   frame = Tkinter.Frame(root)
+   frame.pack(expand=1,fill='both')
+
+   for name in ('About24','Save24'):
+      Tkinter.Label(frame, image=images.get_image(name)).pack(side=Tkinter.TOP)
+
+   root.mainloop()
+   sys.exit()
+
+try:
+   from Aster import prefs
+   ICONDIR=prefs.ICONDIR
+except:
+   # Par defaut on utilise le repertoire local icons
+   ICONDIR=os.path.join(os.path.abspath(os.path.dirname(__file__)),'/Editeur/icons')
+
+
+dico_images={}
+
+def get_image(name):
+    if dico_images.has_key(name):
+        return dico_images[name]
+    else : 
+        fic_image = os.path.join(ICONDIR,name)
+        if not os.path.isfile(fic_image):
+           file, ext = os.path.splitext(fic_image)
+           fic_image = file + '.gif'
+        image = Tkinter.PhotoImage(file=fic_image)
+        dico_images[name]=image
+        return image
+
+def update_cache():
+   global dico_images
+   dico_images={}
+
diff --git a/InterfaceTK/jdcdisplay.py b/InterfaceTK/jdcdisplay.py
new file mode 100644 (file)
index 0000000..c5a3eeb
--- /dev/null
@@ -0,0 +1,285 @@
+# -*- 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 contient la classe JDCDISPLAY qui réalise l'affichage
+   du jeu de commandes sous la forme d'un arbre et de panneaux qui portent
+   les informations attachées au noeud de l'arbre sélectionné
+"""
+# Modules Python
+import types,sys
+import traceback
+import Tkinter
+import Pmw
+
+# Modules Eficas
+import panels
+from treeitemincanvas import TREEITEMINCANVAS
+from widgets import showinfo,showerror
+
+class CONFIG:
+   isdeveloppeur='NON'
+
+class JDCDISPLAY:
+   """
+       Cette classe ajoute à la class TREEITEMINCANVAS l'affichage des infos
+       attachées au noeud sélectionné dans un notebook
+       L'objet item associé au jdc est créé par la classe TREEITEMINCANVAS
+   """
+   def __init__(self,jdc,nom_jdc,appli=None,parent=None):
+      self.jdc=jdc
+      self.nom_jdc=nom_jdc
+      self.fichier=None
+      self.panel_courant=None
+
+      if not appli:
+         class Appli:
+            def __init__(self):
+               self.CONFIGURATION=CONFIG()
+            def affiche_infos(self,message):
+               print message
+               return
+
+            def efface_aide(self,event):
+               return
+
+            def affiche_aide(self,event,aide):
+               print aide
+               return
+
+         appli=Appli()
+      self.appli=appli
+
+      if not parent:
+         parent=Tkinter.Tk()
+         Pmw.initialise(parent)
+      self.parent=parent
+      self.node_selected = None
+      self.modified='n'
+
+      self.pane=Pmw.PanedWidget(self.parent,orient='horizontal')
+      self.pane.add('treebrowser',min=0.4,size=0.5)
+      self.pane.add('selected',min=0.4)
+      self.pane.pack(expand=1,fill='both')
+      self.tree=TREEITEMINCANVAS(jdc,nom_jdc,self.pane.pane('treebrowser'),
+                 self.appli,self.select_node,self.make_rmenu)
+
+   def make_rmenu(self,node,event):
+      if hasattr(node.item,'rmenu_specs'):
+         rmenu = Tkinter.Menu(self.pane.pane('treebrowser'), tearoff=0)
+         #node.select()
+         self.cree_menu(rmenu,node.item.rmenu_specs,node)
+         rmenu.tk_popup(event.x_root,event.y_root)
+
+   def cree_menu(self,menu,itemlist,node):
+      """
+            Ajoute les items du tuple itemlist
+            dans le menu menu
+      """
+      number_item=0
+      radio=None
+      for item in itemlist:
+         number_item=number_item + 1
+         if not item :
+            menu.add_separator()
+         else:
+            label,method=item
+            if type(method) == types.TupleType:
+                 # On a un tuple => on cree une cascade
+                 menu_cascade=Tkinter.Menu(menu)
+                 menu.add_cascade(label=label,menu=menu_cascade)
+                 self.cree_menu(menu_cascade,method,node)
+            elif method[0] == '&':
+                 # On a une chaine avec & en tete => on cree un radiobouton
+                 try:
+                    command=getattr(node.item,method[1:])
+                    menu.add_radiobutton(label=label,command=lambda a=self.appli,c=command,n=node:c(a,n))
+                    if radio == None:radio=number_item
+                 except:pass
+            else:
+                 try:
+                    command=getattr(node.item,method)
+                    menu.add_command(label=label,command=lambda a=self.appli,c=command,n=node:c(a,n))
+                 except:pass
+      # Si au moins un radiobouton existe on invoke le premier
+      if radio:menu.invoke(radio)
+
+   def select(self):
+      return
+
+   def unselect(self):
+      return
+
+   def select_node(self,node):
+      """
+          Cette méthode est appelée à chaque fois qu'un noeud est sélectionné
+          dans l'arbre.
+          Elle permet l'affichage du panneau correspondant au noeud sélectionné
+      """
+      if node is not self.node_selected :
+         #ATTENTION: il faut affecter l'attribut node_selected avant d'appeler 
+         # create_panel pour eviter une recursion infinie entre create_panel, 
+         # Emit, onValid, select_node
+         self.node_selected = node
+         self.create_panel(node)
+      elif self.panel_courant:
+         self.panel_courant.update_panel()
+
+   def create_panel(self,node):
+      """
+         Lance la génération du panneau contextuel de l'objet sélectionné 
+         dans l'arbre
+      """
+      if self.panel_courant:
+          # On detruit le panneau
+          self.panel_courant.destroy()
+          o=self.panel_courant
+          self.panel_courant=None
+          # Mettre à 1 pour verifier les cycles entre objets
+          # pour les panneaux
+          withCyclops=0
+          if withCyclops:
+             from Misc import Cyclops
+             z = Cyclops.CycleFinder()
+             z.register(o)
+             del o
+             z.find_cycles()
+             z.show_stats()
+             z.show_cycles()
+
+      if node is None:
+          self.panel_courant=None
+          return self.panel_courant
+
+      if node.item.isactif():
+          if hasattr(node.item,"panel"):
+              self.panel_courant=node.item.panel(self,self.pane.pane('selected'),node)
+          else:
+              raise Exception("Le noeud sélectionné n'a pas de panel associé")
+      else:
+          self.panel_courant = panels.Panel_Inactif(self,self.pane.pane('selected'),node)
+      return self.panel_courant
+
+   def init_modif(self):
+      """
+          Met l'attribut modified à 'o' : utilisé par Eficas pour savoir 
+          si un JDC doit être sauvegardé avant destruction ou non
+      """
+      self.modified = 'o'
+
+   def stop_modif(self):
+      """
+          Met l'attribut modified à 'n' : utilisé par Eficas pour savoir 
+          si un JDC doit être sauvegardé avant destruction ou non
+      """
+      self.modified = 'n'
+
+   def mainloop(self):
+      self.parent.mainloop()
+
+   def ReplaceObjectNode(self,node,new_object,nom_sd=None):
+      """
+      Cette méthode sert à remplacer l'objet pointé par node par
+      new_object.
+      Si nom_sd : on remplace un OPER et on essaie de renommer la
+      nouvelle sd par nom_sd
+      """
+      child = node.append_brother(new_object,retour='oui')
+      if child == 0:
+          self.appli.affiche_infos("Impossible de remplacer l'objet du noeud courant")
+      else:
+          self.init_modif()
+          node.delete()
+          #if nom_sd:
+              #child.item.nomme_sd(nom_sd)
+          child.select()
+          #child.update()
+
+   def doCut(self):
+      """
+      Stocke dans Eficas.noeud_a_editer le noeud à couper
+      """
+      if not self.node_selected.item.iscopiable():
+          showinfo("Copie impossible",
+                   "Cette version d'EFICAS ne permet que la copie d'objets de type 'Commande' ou mot-clé facteur")
+          return
+      self.appli.edit="couper"
+      self.appli.noeud_a_editer = self.node_selected
+
+   def doCopy(self):
+      """
+      Stocke dans Eficas.noeud_a_editer le noeud à copier
+      """
+      if not self.node_selected.item.iscopiable():
+          showinfo("Copie impossible",
+                   "La copie d'un tel objet n'est pas permise")
+          return
+      self.appli.edit="copier"
+      self.appli.noeud_a_editer = self.node_selected
+
+   def doPaste(self):
+      """
+      Lance la copie de l'objet placé dans self.appli.noeud_a_editer
+      Ne permet que la copie d'objets de type Commande ou MCF
+      """
+      try:
+         child=self.appli.noeud_a_editer.doPaste(self.node_selected)
+      except:
+         traceback.print_exc()
+         showinfo("Action de coller impossible",
+                  "L'action de coller apres un tel objet n'est pas permise")
+         return
+
+      if child == 0:
+          if self.appli.message != '':
+             showerror("Copie refusée",self.appli.message)
+             self.appli.message = ''
+          self.appli.affiche_infos("Copie refusée")
+          return
+
+      # il faut déclarer le JDCDisplay_courant modifié
+      self.init_modif()
+      # suppression éventuelle du noeud sélectionné
+      # si possible on renomme l objet comme le noeud couper
+      if self.appli.edit == "couper":
+         #nom = self.appli.noeud_a_editer.item.object.sd.nom
+         item=self.appli.noeud_a_editer.item
+         self.appli.noeud_a_editer.delete()
+         child.item.update(item)
+         #test,mess = child.item.nomme_sd(nom)
+         child.select()
+      # on rend la copie à nouveau possible en libérant le flag edit
+      self.appli.edit="copier"
+
+   def update(self):
+      """Cette methode est utilisee par le JDC associe pour 
+         signaler des modifications globales du JDC
+      """
+      self.tree.update()
+
+   def supprime(self):
+      #print "supprime",self
+      self.select_node(None)
+      self.tree.supprime()
+      self.tree=None
+      self.pane.destroy()
+
+   #def __del__(self):
+   #   print "__del__",self
diff --git a/InterfaceTK/listeFichiers.py b/InterfaceTK/listeFichiers.py
new file mode 100644 (file)
index 0000000..9a9843f
--- /dev/null
@@ -0,0 +1,81 @@
+import string
+
+class listeFichiers :
+
+    def __init__(self,appli):
+       self.appli=appli
+       self.premiere=1
+       self.nbfich=0
+       self.rep=self.appli.CONFIGURATION.rep_user
+       self.menuFichier=self.appli.menubar.menudict['Fichier']
+       self.monFichier=self.rep+"/listefichiers"
+       self.liste_Fichiers=[] 
+       self.init_Fichier()
+       self.traite_liste()
+
+    def init_Fichier(self):
+        index=0
+        try :
+            f=open(self.monFichier)
+            while ( index < 5) :
+              ligne=f.readline()
+              if ligne != "" :
+                 l=(ligne.split("\n"))[0]
+                 self.liste_Fichiers.append(l)
+              index=index+1
+        except :
+             pass
+        try :
+            f.close()
+        except :
+             pass
+
+    def sauve_Fichier(self):
+        try :
+            if len(self.liste_Fichiers) == 0 :
+              return
+            f=open(self.monFichier,'w')
+            index=0
+            while ( index <  len(self.liste_Fichiers)):
+              ligne=self.liste_Fichiers[index]+"\n"
+              f.write(ligne)
+              index=index+1
+        except :
+             pass
+        try :
+            f.close()
+        except :
+             pass
+
+    def traite_liste(self):
+        index=0
+        for  index in range(self.nbfich):
+           self.menuFichier.delete(9)
+        self.nbfich = 0
+        index = 0
+        while( index < len(self.liste_Fichiers)) :
+            self.ajout_item(index)
+            index=index+1
+           
+    def ajout_item(self,index):
+        if self.premiere and (len(self.liste_Fichiers)!=0):
+           self.premiere=0
+           self.menuFichier.add_separator()
+        label=self.liste_Fichiers[index]
+        self.menuFichier.insert_command(8,label=label,command= lambda self=self, l=label:self.coucou (l));
+        self.nbfich=self.nbfich+1
+
+    def coucou(self,label):
+        self.appli.bureau.openJDC(file=label) 
+
+    def aOuvert(self,file):
+         if file not in self.liste_Fichiers :
+            if (len(self.liste_Fichiers) > 4) :
+               f=self.liste_Fichiers[0]
+               self.liste_Fichiers.remove(f)
+            self.liste_Fichiers.insert(len(self.liste_Fichiers),file)
+         else:
+            self.liste_Fichiers.remove(file)
+            self.liste_Fichiers.insert(len(self.liste_Fichiers),file)
+         self.traite_liste()
+         self.sauve_Fichier()
diff --git a/InterfaceTK/listePatronsTK.py b/InterfaceTK/listePatronsTK.py
new file mode 100644 (file)
index 0000000..350749b
--- /dev/null
@@ -0,0 +1,27 @@
+import os
+import re
+import Tkinter
+
+
+from Editeur import listePatrons
+
+class listePatronsTK(listePatrons.listePatrons) :
+
+    def __init__(self,appli):
+       self.appli=appli
+       listePatrons.listePatrons.__init__(self)
+       self.ajout_menu()
+
+    def ajout_menu(self):
+        menuFichier=self.appli.menubar.menubar
+        menu_cascade=Tkinter.Menu(menuFichier,tearoff=0)
+        menuFichier.add_cascade(label="Patrons",menu=menu_cascade)
+        for ss_menu in self.liste.keys():
+           ssmenu=Tkinter.Menu(menu_cascade,tearoff=0)
+           menu_cascade.add_cascade(label=ss_menu,menu=ssmenu)
+           for fichier in self.liste[ss_menu]:
+               ssmenu.add_command(label=fichier,command= lambda self=self, l=fichier:self.ouvre(l));
+
+    def ouvre(self,label):
+        fichier=self.rep_patrons+"/"+label
+        self.appli.bureau.openJDC(file=fichier,enregistre="non") 
diff --git a/InterfaceTK/macrodisplay.py b/InterfaceTK/macrodisplay.py
new file mode 100644 (file)
index 0000000..a0e7e8d
--- /dev/null
@@ -0,0 +1,165 @@
+# -*- 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 contient la classe MacroDisplay qui realise l'affichage 
+   des sous commandes d'une macro sous forme d'arbre
+"""
+# Modules Python
+import types,sys
+import Tkinter,Pmw
+
+# Modules EFICAS
+import images
+import tooltip
+from Editeur import Objecttreeitem
+import compojdc
+import treewidget
+from widgets import Fenetre
+from Ihm import CONNECTOR
+
+class MACRO2TreeItem(compojdc.JDCTreeItem):
+      pass
+
+class MacroDisplay:
+  def __init__(self,appli,macroitem,nom_jdc):
+    self.fenetre = Tkinter.Toplevel()
+    self.fenetre.configure(width = 800,height=500)
+    self.fenetre.protocol("WM_DELETE_WINDOW", self.quit)
+    self.fenetre.title("Visualisation Macro_Etape")
+    self.macroitem=macroitem
+    self.jdc=macroitem.object.jdc_aux
+    self.nom_jdc=nom_jdc
+    self.appli=appli
+    self.barre=Tkinter.Frame(self.fenetre,relief="ridge",bd=2)
+    self.barre.pack(expand=0,fill=Tkinter.X)
+    if self.macroitem.object.fichier_text is not None:
+      b=Tkinter.Button(self.barre,image=images.get_image("Zoom24"),command=self.visufile)
+      b.pack(side='left')
+      tp=tooltip.TOOLTIP(b,"View file")
+    self.mainPart=Pmw.ScrolledCanvas(self.fenetre,
+                                     hull_width=600,
+                                     hull_height=500,
+                                     borderframe=1)
+    self.canvas=self.mainPart.component('canvas')
+    Pmw.Color.changecolor(self.canvas,background='gray95')
+    self.mainPart.pack(padx=10,pady=10,fill = 'both', expand = 1)
+    self.item=MACRO2TreeItem(self.appli,nom_jdc,self.jdc)
+    self.tree = treewidget.Tree(self.appli,self.item,self.mainPart,command=None,rmenu=self.make_rmenu)
+    self.tree.draw()
+    CONNECTOR.Connect(self.jdc,"close",self.onCloseView,())
+
+  def onCloseView(self):
+    self.quit()
+
+  def visufile(self):
+    Fenetre(self.appli,titre="Source du fichier inclus",texte=self.macroitem.object.fichier_text)
+
+  def make_rmenu(self,node,event):
+      if hasattr(node.item,'rmenu_specs'):
+         rmenu = Tkinter.Menu(self.canvas, tearoff=0)
+         self.cree_menu(rmenu,node.item.rmenu_specs,node)
+         rmenu.tk_popup(event.x_root,event.y_root)
+
+  def cree_menu(self,menu,itemlist,node):
+      """
+            Ajoute les items du tuple itemlist
+            dans le menu menu
+      """
+      number_item=0
+      radio=None
+      for item in itemlist:
+         number_item=number_item + 1
+         if not item :
+            menu.add_separator()
+         else:
+            label,method=item
+            if type(method) == types.TupleType:
+                 # On a un tuple => on cree une cascade
+                 menu_cascade=Tkinter.Menu(menu)
+                 menu.add_cascade(label=label,menu=menu_cascade)
+                 self.cree_menu(menu_cascade,method,node)
+            elif method[0] == '&':
+                 # On a une chaine avec & en tete => on cree un radiobouton
+                 try:
+                    command=getattr(node.item,method[1:])
+                    menu.add_radiobutton(label=label,command=lambda a=self.appli,c=command,n=node:c(a,n))
+                    if radio == None:radio=number_item
+                 except:pass
+            else:
+                 try:
+                    command=getattr(node.item,method)
+                    menu.add_command(label=label,command=lambda a=self.appli,c=command,n=node:c(a,n))
+                 except:pass
+      # Si au moins un radiobouton existe on invoke le premier
+      if radio:menu.invoke(radio)
+
+  def quit(self):
+    #print "quit",self
+    self.tree.supprime()
+    self.tree=None
+    self.fenetre.destroy()
+
+  #def __del__(self):
+  #  print "__del__",self
+
+def makeMacroDisplay(appli,macroitem,nom_item):
+  return MacroDisplay(appli,macroitem,nom_item)
+
+import treeitemincanvas
+
+class TREEITEMINCANVAS(treeitemincanvas.TREEITEMINCANVAS):
+   def __init__(self,object,nom="",parent=None,appli=None,sel=None,rmenu=None):
+      #print "TREEITEMINCANVAS",object
+      self.object=object
+      self.nom=nom
+      self.appli=appli
+      self.parent=parent
+
+      self.item=MACRO2TreeItem(self.appli,self.nom,self.object)
+      self.canvas=Pmw.ScrolledCanvas(self.parent,borderframe=1,canvas_background='gray95')
+      self.canvas.pack(padx=10,pady=10,fill = 'both', expand = 1)
+      if not sel:
+         def sel(event=None):
+            return
+      self.tree=treewidget.Tree(self.appli,self.item,self.canvas,command=sel,rmenu=rmenu)
+      self.tree.draw()
+
+import jdcdisplay
+
+class MACRODISPLAY(jdcdisplay.JDCDISPLAY):
+   def __init__(self,jdc,nom_jdc,appli=None,parent=None):
+      #print "MACRODISPLAY",jdc
+      self.jdc=jdc
+      self.nom_jdc=nom_jdc
+      self.fichier=None
+      self.panel_courant=None
+      self.appli=appli
+      self.parent=parent
+      self.node_selected = None
+      self.modified='n'
+
+      self.pane=Pmw.PanedWidget(self.parent,orient='horizontal')
+      self.pane.add('treebrowser',min=0.4,size=0.5)
+      self.pane.add('selected',min=0.4)
+      self.pane.pack(expand=1,fill='both')
+      self.tree=TREEITEMINCANVAS(jdc,nom_jdc,self.pane.pane('treebrowser'),
+                 self.appli,self.select_node,self.make_rmenu)
+
diff --git a/InterfaceTK/menubar.py b/InterfaceTK/menubar.py
new file mode 100644 (file)
index 0000000..b1aea08
--- /dev/null
@@ -0,0 +1,46 @@
+# -*- 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 Tkinter import Menu
+
+class MENUBAR:
+   def __init__(self,appli,parent):
+      # L'attribut appli pointe vers l'objet application qui détient la menubar et les autres composants
+      self.appli=appli
+      # L'attribut parent pointe vers l'objet graphique parent de la menubar
+      self.parent=parent
+      self.menubar=Menu(self.parent)
+      self.parent.configure(menu=self.menubar)
+      self.init()
+
+   try:
+      from prefs import labels
+   except:
+      labels= ('Fichier','Edition','Jeu de commandes','Catalogue','Options','Aide','Traducteur')
+
+   def init(self):
+      self.menudict={}
+      for label in self.labels:
+         menu=Menu(self.menubar,tearoff=0)
+         self.menudict[label]=menu
+         self.menubar.add_cascade(label=label,menu=menu)
+
diff --git a/InterfaceTK/newsimppanel.py b/InterfaceTK/newsimppanel.py
new file mode 100644 (file)
index 0000000..0a04ce0
--- /dev/null
@@ -0,0 +1,196 @@
+# -*- 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 Tkinter import *
+import Pmw
+from copy import copy,deepcopy
+import traceback
+
+# Modules Eficas
+from Editeur import Objecttreeitem
+from Aster import prefs
+import panels
+import images
+import composimp
+from widgets import ListeChoix
+from widgets import FenetreDeSelection
+
+from Noyau.N_CR import justify_text
+from Editeur.utils import substract_list
+
+
+class newSIMPPanel(panels.OngletPanel):
+  """
+  Classe virtuelle servant de classe mère à toutes les classes Panel
+  servant à afficher et récupérer la valeur d'un mot-clé simple.
+  Le panel est différent suivant le type de la valeur attendu
+  """
+  def init(self):
+      """
+      Méthode appelée par le constructeur de OngletPanel :
+      construit le notebook à 2 onglets utilisé par tous les panels de
+      tous les mots-clés simples
+      """
+      nb = Pmw.NoteBook(self,raisecommand=self.raisecmd)
+      nb.pack(fill = 'both', expand = 1)
+      self.nb=nb
+      nb.add('Valeur', tab_text='Saisir valeur')
+      self.makeValeurPage(nb.page('Valeur'))
+      self.enlevebind()
+      self.creebind()
+      nb.setnaturalsize()
+      
+# ----------------------------------------------------------------------------------------
+#   Méthodes utilisées pour l'affectation de la valeur donnée par l'utilisateur
+#    au mot-clé courant
+# ----------------------------------------------------------------------------------------
+
+  def reset_old_valeur(self,name=None,mess='Valeur du mot-clé enregistrée'):
+      """
+          Enregistre  val comme valeur de self.node.item.object SANS 
+          faire de test de validité ni ré-évaluer l'ancienne valeur
+          permet de rester avec des valeurs non entrees et de ne pas 
+          ré-évaluer des entiers par exemple
+      """
+      if self.parent.modified == 'n' : self.parent.init_modif()
+      self.node.item.set_valeur(name)
+      self.parent.appli.affiche_infos(mess)
+
+  def record_valeur(self,name=None,mess='Valeur du mot-clé enregistrée'):
+      """
+          Enregistre  val comme valeur de self.node.item.object  
+          en evaluant l item et en le validant 
+          Si name n'est pas renseigné, la valeur 
+      """
+      if self.parent.modified == 'n' : self.parent.init_modif()
+      if name != None:
+          valeur = name
+          validite = 1
+      else :
+          valeurentree= self.entry.get()
+          self.entry.delete(0,END)
+          if valeurentree == '': valeurentree=None
+          valeur,validite=self.node.item.eval_valeur(valeurentree)
+          if not validite :
+                  valeur= self.entry.get()
+                  commentaire = "impossible d'évaluer : %s " %`valeurentree`
+                  self.parent.appli.affiche_infos(commentaire)
+                
+      if validite : 
+          validite,commentaire=self.node.item.valide_val(valeur)
+      if validite :
+          self.node.item.set_valeur(valeur)
+          self.parent.appli.affiche_infos(mess)
+      else :
+          self.parent.appli.affiche_infos(commentaire)
+
+# ----------------------------------------------------------------------------------------
+#   Méthodes utilisées pour la manipulation des items dans les listes de choix
+# ----------------------------------------------------------------------------------------
+  def selectValeur(self,name):
+      self.selected_valeur = name
+
+  def deselectValeur(self,name):
+      self.selectValeur = None
+
+  def sup_valeur(self,name=None):
+      """
+      Supprime la valeur selectionnée de la liste des valeurs et la rajoute
+      à la liste des choix possibles
+      """
+      if hasattr(self,'selected_valeur') :
+         if ( self.selected_valeur != None and self.selected_valeur != ''):
+            liste_valeurs = self.Liste_valeurs.get_liste()
+            liste_valeurs.remove(self.selected_valeur)
+            self.Liste_valeurs.put_liste(liste_valeurs)
+            listeActuelle=self.Liste_valeurs.get_liste()
+            liste_choix=self.node.item.get_liste_possible(listeActuelle)
+            self.Liste_choix.put_liste(liste_choix)
+            self.selected_valeur = None
+
+  def add_choix(self,name=None):
+      """
+      Ajoute le choix selectionné à la liste des valeurs et le retire
+      de la liste des choix possibles
+      """
+      
+      if hasattr(self,'selected_choix') :
+         if (self.selected_choix != None and self.selected_choix != ''):
+            min,max = self.node.item.GetMinMax()
+            liste_valeurs = self.Liste_valeurs.get_liste()
+            if len(liste_valeurs) >= max :
+                self.parent.appli.affiche_infos("La liste ne peut pas avoir plus de %d éléments" %max)
+                return
+            if (self.Liste_valeurs.selection != None):
+                ligne=self.Liste_valeurs.cherche_selected_item()
+                liste_valeurs.insert(ligne,self.selected_choix)
+            else :
+                liste_valeurs.append(self.selected_choix)
+            self.Liste_valeurs.put_liste(liste_valeurs)
+            listeActuelle=self.Liste_valeurs.get_liste()
+            liste_choix=self.node.item.get_liste_possible(listeActuelle)
+            self.Liste_choix.put_liste(liste_choix)
+            self.selected_choix = None
+
+  def selectChoix(self,name):
+      self.selected_choix = name
+
+  def deselectChoix(self,name):
+      self.selectChoix = None
+      
+  def raisecmd(self,page):
+      try:
+         self.entry.focus()
+      except:
+         pass
+
+# ----------------------------------------------------------------------------------------
+#   Méthodes utilisées pour la manipulation des items en notation scientifique
+# ----------------------------------------------------------------------------------------
+  def set_valeur_texte(self,texte_valeur) :
+      """ Sert à mettre à jour la notation scientifique"""
+      try :
+        if "R" in self.node.item.object.definition.type:
+            if texte_valeur[0] != "'":
+               clef=eval(texte_valeur)
+               if str(clef) != str(texte_valeur) :
+                  self.node.item.object.init_modif()
+                  clefobj=self.node.item.object.GetNomConcept()
+                  if not self.parent.appli.dict_reels.has_key(clefobj):
+                     self.parent.appli.dict_reels[clefobj] = {}
+                  self.parent.appli.dict_reels[clefobj][clef]=texte_valeur
+                  self.parent.appli.dict_reels[clefobj]
+                  self.node.item.object.fin_modif()
+      except:
+        pass
+
+
+  def get_valeur_texte(self,valeur) :
+     valeur_texte=""
+     if "R" in self.node.item.object.definition.type:
+        clefobj=self.node.item.object.GetNomConcept()
+        if self.parent.appli.dict_reels.has_key(clefobj):
+           if self.parent.appli.dict_reels[clefobj].has_key(valeur):
+              valeur_texte=self.parent.appli.dict_reels[clefobj][valeur]
+     return valeur_texte
diff --git a/InterfaceTK/options.py b/InterfaceTK/options.py
new file mode 100644 (file)
index 0000000..9d0da1e
--- /dev/null
@@ -0,0 +1,132 @@
+# -*- 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 os,string
+
+# Modules Eficas
+from widgets import askopenfilename
+import panels
+
+# l'option affichage_commandes peut prendre les valeurs "groupes" ou "alphabetic"
+affichage_commandes="alphabetic"
+
+class OPTIONS:
+
+   menu_defs=[
+        ('Options',[
+                   ("Affichage commandes",(("alphabétique",'&affichage_alpha'),("groupes",'&affichage_grp'))),
+                   #("Couleur",(("fond",'change_fond'),("barre",'change_barre'))),
+                   # ("Catalogue développeur",'choix_cata_developpeur'),
+                   ('Paramètres Eficas','affichage_fichier_ini'),
+                   ('Paramètres Affichage','affichage_style_ini'),
+                      
+                   ]
+        )
+             ]
+
+   button_defs=[]
+
+   def __init__(self,appli,parent):
+      self.appli=appli
+      self.parent=parent
+
+
+   def affichage_grp(self):
+      global affichage_commandes
+      affichage_commandes="groupes"
+      if hasattr(panels,'panneauCommande'):
+         panel=panels.panneauCommande
+         parent=panel.parent
+         if parent != None :
+            parent.create_panel(parent.node_selected)
+            # si on a un panel avec plusieurs onglets
+            # on affiche Commande
+            try :
+              parent.panel_courant.nb.selectpage("Commande")
+            except :
+              pass
+
+   def affichage_alpha(self):
+
+      global affichage_commandes
+      affichage_commandes="alphabetic"
+      if hasattr(panels,'panneauCommande'):
+         panel=panels.panneauCommande
+         parent=panel.parent
+         if parent != None :
+            parent.create_panel(parent.node_selected)
+            # si on a un panel avec plusieurs onglets
+            # on affiche Commande
+            try :
+              parent.panel_courant.nb.selectpage("Commande")
+            except :
+              pass
+
+   def change_fond(self):
+      from tkColorChooser import askcolor
+      #nouvelle=askcolor(self.appli.background)
+      nouvelle=askcolor('grey')
+
+   def change_barre(self):
+       pass
+
+   def choix_cata_developpeur(self):
+      """ 
+          Cette méthode demande à l'utilisateur-développeur d'indiquer quel catalogue
+          il veut utiliser en remplacement du catalogue standard du code
+          NB : il faut que le développeur ait les droits d'écriture dans le répertoire où
+          se trouve le catalogue 
+      """
+      file = askopenfilename(title="Choix d'un catalogue personnel",
+                             defaultextension=".py",
+                             filetypes = ( ("Catalogue", "cata*.py"),))
+      if file :
+          self.parent.update_idletasks()
+          self.appli.reset_affichage_infos()
+          rep_fic = os.path.dirname(file)
+          nom_fic = string.split(os.path.basename(file),'.')[0]
+          rep_courant = os.getcwd()
+          os.chdir(rep_fic)
+          self.cata = __import__(nom_fic)
+          self.code = self.cata.CODE
+          os.chdir(rep_courant)
+          self.fic_cata = file
+          fic_cata_p = nom_fic+'_pickled.py'
+          self.fic_cata_p = os.path.join(rep_fic,fic_cata_p)
+          pile_erreurs = self.cata.erreurs_cata
+          if pile_erreurs.existe_message() :
+              messages = pile_erreurs.retourne_messages()
+              print messages
+          else :
+              # XXX ne doit pas fonctionner
+              self.catalo = catabrowser.CataItem(cata=self.cata)
+              self.Retrouve_Ordre_Cata('personnel')
+          pile_erreurs.efface()
+
+
+   def affichage_fichier_ini(self):
+       self.appli.CONFIGURATION.affichage_fichier_ini()
+
+
+   def affichage_style_ini(self):
+       self.appli.CONFIGStyle.affichage_style_ini()
diff --git a/InterfaceTK/panels.py b/InterfaceTK/panels.py
new file mode 100644 (file)
index 0000000..15ab8ca
--- /dev/null
@@ -0,0 +1,592 @@
+# -*- 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
+import os
+from Tkinter import *
+import Pmw
+import time
+import traceback
+
+import widgets
+from widgets import ListeChoix
+from widgets import ListeChoixParGroupes
+from Aster import prefs
+import options
+
+SEPARATEUR = '-'*30
+
+
+class Panel(Frame) :
+  """
+  Classe servant de classe mère à toutes celles représentant les
+  panneaux à afficher en fonction de la nature de l'objet en cours
+  Elle est toujours dérivée.
+  """
+  def __init__(self,parent,panneau,node) :
+      # Le parent d'un panel est un objet de la classe JDCDISPLAY ou derivee
+      # ou un objet qui a les attributs : appli (de classe APPLI ou derivee),
+      # modified et la methode init_modif
+      self.parent=parent
+      self.panneau = panneau
+      self.node=node
+      Frame.__init__(self,self.panneau)
+      self.place(x=0,y=0,relheight=1,relwidth=1)
+      self.creer_boutons()
+      self.init()
+      global panneauCommande
+      panneauCommande=self
+
+  #def __del__(self):
+  #    print "__del__",self
+
+  def update_panel(self):
+      """Methode appele pour demander une mise a jour du panneau"""
+
+  def destroy(self):
+      Frame.destroy(self)
+      self.panneau=None
+      self.parent=None
+      # Because on herite de Frame
+      self.master=None
+      # On supprime explicitement les references aux objets Tk
+      self.nb=None
+      self.fr_but=None
+      self.bouton_cata=None
+      self.bouton_doc=None
+      self.bouton_com=None
+      self.bouton_sup=None
+      #self.frame_eval=None
+      self.label=None
+      self.frame_boutons=None
+      self.frame_comment=None
+      self.frame_param=None
+      # On termine la suppression de facon brutale (objets Tk et non Tk)
+      for k in self.__dict__.keys():
+         # il est plus prudent de ne pas détruire le lien sur le Node
+         # si on voulait mettre l'attribut node à None, il faudrait
+         # que tous les appels à node.parent.select() apparaissent après
+         # toutes les autres actions liées au panel (node.item.isglobal(), ...)
+         if k != 'node' : setattr(self,k,None)
+
+  def creer_boutons(self):
+      """
+      Méthode créant les boutons se trouvant dans la partie contextuelle d'EFICAS
+      (à droite sous les onglets )
+      """
+      self.fr_but = Frame(self,height=30)
+      self.fr_but.pack(side='bottom')
+      #self.fr_but.pack(side='bottom',fill='x')
+      #self.bouton_com = Button(self.fr_but, text = 'Commentariser', command = self.ajout_commentaire, width=14)
+      #self.bouton_sup = Button(self.fr_but, text = "Supprimer", command=self.supprimer, width=14)
+      #self.bouton_doc = Button(self.fr_but, text="Documentation", command=self.visu_doc, width=14)
+      #self.bouton_cata = Button(self.fr_but, text = "Catalogue", command = self.show_catalogue, width=14)
+      self.bouton_com = Button(self.fr_but, text = 'Commentariser', command = self.ajout_commentaire)
+      self.bouton_sup = Button(self.fr_but, text = "Supprimer", command=self.supprimer)
+      self.bouton_doc = Button(self.fr_but, text="Documentation", command=self.visu_doc)
+      self.bouton_cata = Button(self.fr_but, text = "Catalogue", command = self.show_catalogue)
+
+      if self.parent.appli.CONFIGURATION.isdeveloppeur == 'OUI':
+          self.bouton_sup.pack(side='left',padx=5, pady=5)
+          self.bouton_cata.pack(side='left',padx=5, pady=5)
+          self.bouton_doc.pack(side='right',padx=5, pady=5)
+          #self.bouton_sup.place(relx=0.25,rely = 0.5,relheight = 0.8,anchor='center')
+          #self.bouton_cata.place(relx=0.5,rely = 0.5,relheight = 0.8,anchor='center')
+          #self.bouton_doc.place(relx=0.75,rely = 0.5,relheight = 0.8,anchor='center')
+      else:
+          self.bouton_sup.pack(side='left',padx=5, pady=5)
+          self.bouton_doc.pack(side='right',padx=5, pady=5)
+          #self.bouton_sup.place(relx=0.3,rely = 0.5,relheight = 0.8,anchor='center')
+          #self.bouton_doc.place(relx=0.7,rely = 0.5,relheight = 0.8,anchor='center')
+
+  def show_catalogue(self):
+      try:
+          genea = self.node.item.get_genealogie()
+          self.parent.appli.browser_catalogue_objet(genea)
+      except Exception,e:
+          traceback.print_exc()
+      
+  def efface(self):
+      self.node.efface()
+
+# ------------------------------------------------------------------------
+#     Méthodes permettant d'ajouter des commentaires, des paramètres
+#                     et des objets EVAL.
+#       Ces méthodes sont utilisées par les panneaux des JDC,ETAPE,
+#                 COMMENTAIRE et PARAMETRE
+# ------------------------------------------------------------------------
+
+  def ajout_commentaire(self,ind='after'):
+      """
+      Ajoute un commentaire à l'intérieur du JDC :
+      - si ind='after'  : l'ajoute après l'objet courant
+      - si ind='before' : l'ajoute avant.
+      """
+      if self.parent.modified == 'n' : self.parent.init_modif()
+      return self.node.append_brother("COMMENTAIRE",ind)
+    
+  def ajout_commentaire_first(self):
+      """
+      Ajoute un commentaire en début de JDC
+      """
+      if self.parent.modified == 'n' : self.parent.init_modif()
+      return self.node.append_child("COMMENTAIRE",'first')
+
+  def ajout_parametre(self,ind='after'):
+      """
+      Ajoute un parametre à l'intérieur du JDC :
+      - si ind='after'  : l'ajoute après l'objet courant
+      - si ind='before' : l'ajoute avant.
+      """
+      if self.parent.modified == 'n' : self.parent.init_modif()
+      return self.node.append_brother("PARAMETRE",ind)
+    
+  def ajout_parametre_first(self):
+      """
+      Ajoute un parametre en début de JDC
+      """
+      if self.parent.modified == 'n' : self.parent.init_modif()
+      return self.node.append_child("PARAMETRE",'first')
+
+#  def ajout_parametre_eval(self,ind='after'):
+#      """
+#      Ajoute un paramètre EVAL à l'intérieur du JDC :
+#      - si ind='after'  : l'ajoute après l'objet courant
+#      - si ind='before' : l'ajoute avant.
+#      """
+#      if self.parent.modified == 'n' : self.parent.init_modif()
+#      return self.node.append_brother("PARAMETRE_EVAL",ind)
+    
+#  def ajout_parametre_eval_first(self):
+#      """
+#      Ajoute un paramètre EVAL en début de JDC
+#      """
+#      if self.parent.modified == 'n' : self.parent.init_modif()
+#      return self.node.append_child("PARAMETRE_EVAL",'first')
+    
+# ------------------------------------------------------------------------
+   
+  def visu_doc(self):
+      """ Permet d'ouvrir le fichier doc U de la commande au format pdf avec Acrobat Reader
+        - Ne fonctionne pas sous UNIX (chemin d'accès Acrobat Reader)
+        - indication du chemin d'accès aux fichiers pdf à revoir : trop statique"""
+      cle_doc = self.node.item.get_docu()
+      if cle_doc == None : return
+      cle_doc = string.replace(cle_doc,'.','')
+      cle_doc = string.replace(cle_doc,'-','')
+      commande = self.parent.appli.CONFIGURATION.exec_acrobat
+      nom_fichier = cle_doc+".pdf"
+      fichier = os.path.abspath(os.path.join(self.parent.appli.CONFIGURATION.path_doc,
+                                       nom_fichier))
+      if os.name == 'nt':
+          os.spawnv(os.P_NOWAIT,commande,(commande,fichier,))
+      elif os.name == 'posix':
+          script ="#!/usr/bin/sh \n%s %s&" %(commande,fichier)
+          pid = os.system(script)
+      
+  def supprimer(self):
+      """
+      Suppression du noeud courant
+      """
+      # On signale au parent du panel (le JDCDisplay) une modification 
+      self.parent.init_modif()
+      self.node.delete()
+      
+  def affiche(self):
+      """ Force l'affichage des fenêtres en cours """
+      self.tkraise()
+
+  def selectMC(self,name):
+      """ On retrouve le mot-clé sous le curseur pour affichage du fr """
+      cmd=self.node.item.get_definition()
+      texte_infos = ''
+      for e in cmd.entites.keys() :
+          if e == name :
+              texte_infos=getattr(cmd.entites[e],prefs.lang)
+              break
+      if texte_infos == '' : texte_infos="Pas d'infos disponibles"
+      self.parent.appli.affiche_infos(texte_infos)
+
+  def defMC(self,name):
+      """ On ajoute un mot-clé à la commande : subnode """
+      if name == SEPARATEUR:return
+      if self.parent.modified == 'n' : self.parent.init_modif()
+      if name != "COMMENTAIRE":
+          self.node.append_child(name)
+      else :
+          self.ajout_commentaire()    
+
+  def selectCmd(self,name):
+      """ On retrouve la commande sous le curseur pour affichage du fr """
+      if name != 'COMMENTAIRE' and name != SEPARATEUR:
+          texte_infos=getattr(self.parent.jdc.get_cmd(name),prefs.lang)
+          self.parent.appli.affiche_infos(texte_infos)
+          
+  def defCmd(self,name):
+      """
+      On ajoute une commande après la commande selectionnée : after
+      ou bien on ajoute un commentaire
+      """
+      if name == SEPARATEUR:return
+      if self.parent.modified == 'n' : self.parent.init_modif()
+      if name != "COMMENTAIRE":
+          #parent=self.node.parent
+          #new_obj = parent.item.append_child(name,self.node.item.getObject())
+          #parent.children[parent.children.index(self.node)+1].select()
+          new_node = self.node.append_brother(name,'after')
+      else :
+          new_node = self.ajout_commentaire()
+
+  def defCmdFirst(self,name):
+      """ On ajoute une commande ou un commentaire au début du fichier de commandes """
+      if name == SEPARATEUR:return
+      if self.parent.modified == 'n' : self.parent.init_modif()
+      if name != "COMMENTAIRE":
+          #new_obj = self.node.item.append_child(name,'first')
+          #self.node.children[0].select()
+          new_node = self.node.append_child(name,'first')
+      else :
+          new_node = self.ajout_commentaire_first()
+        
+class OngletPanel(Panel) :
+  """ Cette classe est virtuelle et doit être dérivée
+      Elle contient les principales méthodes d'affichage des différents onglets"""
+
+  global panelbind
+
+  def raisecmd(self,page):
+      self.nb.page(page).focus_set()
+      if page == 'Concept':
+          try:
+              self._any.focus()
+          except:
+              pass
+      elif page == 'Commande':
+          try:
+              self.command_entry.component('entry').focus()
+          except:
+              pass
+
+  def creebind(self):
+       self.nb.bind_all("<F1>",lambda e,s=self,num=0:s.commande_up(num))
+       self.nb.bind_all("<F2>",lambda e,s=self,num=1:s.commande_up(num))
+       self.nb.bind_all("<F3>",lambda e,s=self,num=2:s.commande_up(num))
+       self.nb.bind_all("<F4>",lambda e,s=self,num=3:s.commande_up(num))
+       OngletPanel.panelbind=self.nb
+
+  def enlevebind(self):
+       if not hasattr(OngletPanel,"panelbind"):
+          return
+       if OngletPanel.panelbind == None:
+          return
+       try:
+           OngletPanel.panelbind.unbind_all("<F1>")
+           OngletPanel.panelbind.unbind_all("<F2>")
+           OngletPanel.panelbind.unbind_all("<F3>")
+           OngletPanel.panelbind.unbind_all("<F4>")
+       except:
+           pass
+       OngletPanel.panelbind = None
+
+  def commande_up(self,num):
+      #print "commande_up de panels pour ", num
+      try :
+        OngletPanel.panelbind.selectpage(num)
+        pageNew=OngletPanel.panelbind.page(num)
+        pageNew.focus_set()
+      except :
+        pass
+
+  def affiche(self):
+      page=self.nb.getcurselection()
+      self.nb.page(page).focus_set()
+      if page == 'Concept':
+          try:
+#              _any est un pointeur sur entry
+#              component est une methode de pmw 
+#              a priori, jamais ok
+              self._any.component('entry').focus_set()
+          except:
+              pass
+      self.tkraise()
+
+# ------------------------------------------------------------------------
+#     Méthodes permettant d'afficher des pages partagées par différents
+#           types d'objets (règles,mots-clés,concept,...)
+# ------------------------------------------------------------------------
+
+  def makeConceptPage(self,page):
+      """
+      Crée la page de saisie du nom du concept
+      """
+      self.label = Label(page,text='Nom du concept :')
+      self.label.place(relx=0.1,rely=0.4)
+      self._any = Entry(page,relief='sunken')
+      self._any.place(relx=0.35,rely=0.4,relwidth=0.5)
+      self._any.bind("<Return>",lambda e,s=self:s.execConcept())
+      self._any.bind("<KP_Enter>",lambda e,s=self:s.execConcept())
+      self._any.insert(0,self.node.item.GetText())
+      self.but_ok=Button(page,text = "Valider",command=self.execConcept)
+      self.but_ok.place(relx=0.35,rely=0.8, relwidth=0.35)
+      type_sd = self.node.item.get_type_sd_prod()
+      if type_sd :
+          txt = "L'opérateur courant retourne un objet de type %s" %type_sd
+          self.label = Label(page, text = txt)
+          self.label.place(relx=0.5,rely=0.55,anchor='n')
+      self._any.focus()
+      # aide associée au panneau
+      bulle_aide="""Tapez dans la zone de saisie le nom que vous voulez donner
+      au concept retounré par l'opérateur courant et pressez <Return> pour valider"""
+      page.bind("<Button-3>", lambda e,s=self,a=bulle_aide : s.parent.appli.affiche_aide(e,a))
+      page.bind("<ButtonRelease-3>",self.parent.appli.efface_aide)
+        
+
+  def makeMoclesPage(self,page):
+      """
+      Crée la page qui affiche la liste des mots-clés que l'on peut
+      encore ajouter
+      """
+      genea =self.node.item.get_genealogie()
+      jdc = self.node.item.get_jdc()
+      liste_mc=self.node.item.get_liste_mc_ordonnee(genea,jdc.cata_ordonne_dico)
+      liste_commandes = (("<Enter>",self.selectMC),
+                         ("<Leave>",self.deselectMC),
+                         ("<Double-Button-1>",self.defMC))
+      Liste = ListeChoix(self,page,liste_mc,liste_commandes = liste_commandes,titre = "Mots-clés permis",optionReturn="oui")
+      Liste.affiche_liste()
+      # aide associée au panneau
+      bulle_aide="""Double-cliquez sur le mot-clé que vous voulez ajouter à
+      la commande en cours d'édition"""
+      Liste.MCbox.bind("<Button-3>", lambda e,s=self,a=bulle_aide : s.parent.appli.affiche_aide(e,a))
+      Liste.MCbox.bind("<ButtonRelease-3>",self.parent.appli.efface_aide)
+      if len(liste_mc) > 0 :
+         Liste.surligne(liste_mc[0])
+      self.Liste=Liste
+
+  def makeCommentairePage(self,page):
+      label = Label(page,text = "Insérer un commentaire :")
+      label.grid(column = 0, row = 2)
+      but_avant = Button(page,text = "AVANT",command = lambda s=self :s.ajout_commentaire(ind = 'before'))
+      but_apres = Button(page,text = "APRES",command = self.ajout_commentaire)
+      but_avant.grid(column = 1,row =2)
+      but_apres.grid(column = 1,row =3)
+      
+  def makeCommandePage(self,page):
+      """
+         Cree l'onglet
+      """
+      frame1 = Frame(page,height = 20)
+      frame1.pack(side='top',fill='x')
+      label = Label(frame1,text ="La commande choisie sera ajoutée\n APRES la commande courante")
+      label.pack(side='top')
+      frame2 = Frame(page)
+      frame2.pack(side='top',fill='both',expand=1)
+      liste_commandes = (("<Enter>",self.selectCmd),
+                         ("<Leave>",self.deselectCmd),
+                         ("<Double-Button-1>",self.defCmd))
+      if options.affichage_commandes == "alphabetic":
+         liste_cmd = self.get_liste_cmd()
+         Liste = ListeChoix(self,frame2,liste_cmd,liste_commandes = liste_commandes,
+                                   filtre='oui',titre = "Commandes",optionReturn="oui")
+      else:
+         liste_commandes=liste_commandes+(("<Return>",self.defCmd),)
+         liste_groupes,dict_groupes=self.get_groups()
+         Liste = ListeChoixParGroupes(self,frame2,liste_groupes,dict_groupes,
+                                      liste_commandes = liste_commandes,
+                                      filtre='oui',titre = "Commandes",optionReturn="oui")
+      Liste.affiche_liste()
+      self.command_entry=Liste.entry
+      # aide associée au panneau
+      bulle_aide="""Double-cliquez sur la commande que vous voulez ajouter au jeu de commandes"""
+      Liste.MCbox.bind("<Button-3>", lambda e,s=self,a=bulle_aide : s.parent.appli.affiche_aide(e,a))
+      Liste.MCbox.bind("<ButtonRelease-3>",self.parent.appli.efface_aide)
+      self.liste_command=Liste
+      global panneauCommande
+      panneauCommande=self
+
+  def makeJDCPage(self,page):
+      """
+      Crée la page correspondant à un objet de type JDC
+      """
+      liste_commandes = (("<Enter>",self.selectCmd),
+                         ("<Leave>",self.deselectCmd),
+                         ("<Double-Button-1>",self.defCmdFirst))
+      if options.affichage_commandes == "alphabetic":
+         liste_cmd = self.get_liste_cmd()
+         Liste = ListeChoix(self,page,liste_cmd,liste_commandes = liste_commandes,
+                            filtre='oui',titre = "Commandes",optionReturn="oui")
+      else:
+         liste_commandes=liste_commandes+(("<Return>",self.defCmdFirst),)
+         liste_groupes,dict_groupes=self.get_groups()
+         Liste = ListeChoixParGroupes(self,page,liste_groupes,dict_groupes,
+                                      liste_commandes = liste_commandes,
+                                      filtre='oui',titre = "Commandes",optionReturn="oui")
+      Liste.affiche_liste()
+       # aide associée au panneau
+      bulle_aide="""Double-cliquez sur la commande que vous voulez ajouter au jeu de commandes"""
+      Liste.MCbox.bind("<Button-3>", lambda e,s=self,a=bulle_aide : s.parent.appli.affiche_aide(e,a))
+      Liste.MCbox.bind("<ButtonRelease-3>",self.parent.appli.efface_aide)
+
+  def makeReglesPage(self,page) :
+      """
+      Crée la page qui affiche la liste des règles avec celle qui ne sont
+      pas respectées en rouge
+      """
+      regles = []
+      regles = self.node.item.get_regles()
+      dictionnaire = self.node.item.get_mc_presents()
+      texte_regles = []
+      l_regles_en_defaut=[]
+      if len(regles) > 0:
+        i = 0
+        for regle in regles :
+          texte_regles.append(regle.gettext())
+          texte,test = regle.verif(dictionnaire)
+          if test == 0 : l_regles_en_defaut.append(i)
+          i = i+1
+      Liste = ListeChoix(self,page,texte_regles,liste_marques=l_regles_en_defaut,active='non',titre="Règles")
+      Liste.affiche_liste()
+      # aide associée au panneau
+      bulle_aide="""Ce panneau contient la liste des règles qui s'appliquent à l'objet
+      en cours d'édition.
+      - en noir : règles valides
+      - en rouge : règles violées"""
+      Liste.MCbox.bind("<Button-3>", lambda e,s=self,a=bulle_aide : s.parent.appli.affiche_aide(e,a))
+      Liste.MCbox.bind("<ButtonRelease-3>",self.parent.appli.efface_aide)
+
+  def makeParamCommentPage_for_etape(self,page):
+      """
+      Crée la page qui offre le choix à l'utilisateur d'ajouter un commentaire
+      ou un paramètre, avant ou après le noeud courant dans l'arbre.
+      Cette page est destinée aux objets de niveau ETAPE cad à toutes les CMD,
+      les commentaires inter commandes et les paramètres
+      """
+      # les frame ...
+      self.frame_comment = Frame(page,bd=1,relief='raised')
+      self.frame_param   = Frame(page,bd=1,relief='raised')
+      self.frame_boutons = Frame(page,bd=1,relief='raised')
+      self.frame_comment.place(relx=0,rely=0,relwidth=1,relheight=0.40)
+      self.frame_param.place(relx=0,rely=0.40,relwidth=1,relheight=0.40)
+      self.frame_boutons.place(relx=0,rely=0.84,relwidth=1,relheight=0.16)
+      # remplissage de la frame commentaire
+      Label(self.frame_comment,text = "Insérer un commentaire :").place(relx=0.1,rely=0.5,anchor='w')
+      but_comment_avant = Button(self.frame_comment,
+                                 text = "AVANT "+self.node.item.get_nom(),
+                                 command = lambda s=self :s.ajout_commentaire(ind = 'before'))
+      but_comment_apres = Button(self.frame_comment,
+                                 text = "APRES "+self.node.item.get_nom(),
+                                 command = self.ajout_commentaire)
+      but_comment_avant.place(relx=0.45,rely=0.3,anchor='w',relwidth=0.45)
+      but_comment_apres.place(relx=0.45,rely=0.7,anchor='w',relwidth=0.45)
+      # remplissage de la frame paramètre
+      Label(self.frame_param,text = "Insérer un paramètre :").place(relx=0.1,rely=0.5,anchor='w')
+      but_param_avant = Button(self.frame_param,
+                                 text = "AVANT "+self.node.item.get_nom(),
+                                 command = lambda s=self :s.ajout_parametre(ind = 'before'))
+      but_param_apres = Button(self.frame_param,
+                                 text = "APRES "+self.node.item.get_nom(),
+                                 command = self.ajout_parametre)
+      but_param_avant.place(relx=0.45,rely=0.3,anchor='w',relwidth=0.45)
+      but_param_apres.place(relx=0.45,rely=0.7,anchor='w',relwidth=0.45)
+      # remplissage de la frame boutons
+      Button(self.frame_boutons,
+             text="Commentariser toute la commande",
+             command = self.comment_commande).place(relx=0.5,rely=0.5,anchor='center')
+    
+  def deselectMC(self,name):
+      self.parent.appli.affiche_infos('')
+    
+  def get_groups(self):
+      jdc=self.node.item.object.get_jdc_root()
+      return jdc.get_groups()
+
+  def get_liste_cmd(self):
+      #print "get_liste_cmd",self.node.item.object
+      jdc=self.node.item.object.get_jdc_root()
+      listeCmd = jdc.get_liste_cmd()
+      return listeCmd
+
+  def deselectCmd(self,name):
+      self.parent.appli.affiche_infos('')
+    
+  def execConcept(self):
+      """
+      Nomme le concept SD retourné par l'étape
+      """
+      if not hasattr(self,'valeur_choisie'):
+          nom = self._any.get()
+      else:
+          nom = self.valeur_choisie.get()
+      nom = string.strip(nom)
+      if nom == '' : return # si pas de nom, on ressort sans rien faire ...
+      if self.parent.modified == 'n' : self.parent.init_modif()
+      test,mess = self.node.item.nomme_sd(nom)
+      #self.node.verif()
+      #self.node.racine.update()
+      self.parent.appli.affiche_infos(mess)
+  
+  def changed(self):
+      pass
+
+  def comment_commande(self):
+    """
+    Cette méthode a pour but de commentariser la commande pointée par self.node
+    """
+    # On traite par une exception le cas où l'utilisateur final cherche à désactiver
+    # (commentariser) un commentaire.
+    try :
+        pos=self.node.parent.children.index(self.node)
+        commande_comment = self.node.item.get_objet_commentarise()
+        # On signale au parent du panel (le JDCDisplay) une modification
+        self.parent.init_modif()
+        self.node.parent.children[pos].select()
+    except Exception,e:
+        traceback.print_exc()
+        widgets.showerror("TOO BAD",str(e))
+    return
+
+      
+class Panel_Inactif(Panel):
+  """
+     Cette classe sert à définir un panneau dans lequel on dit que le noeud 
+     sélectionné n'est pas actif
+  """
+  def __init__(self,parent,panneau,node) :
+      self.parent=parent
+      self.panneau = panneau
+      self.node=node
+      Frame.__init__(self,self.panneau)
+      self.place(x=0,y=0,relheight=1,relwidth=1)
+      self.creer_texte()
+
+  def creer_texte(self):
+      texte = "Le noeud sélectionné ne correspond pas à un objet actif\n"
+      texte = texte + "Seules les commandes placées entre \nDEBUT/POURSUITE et FIN sont actives"
+      longueur = int(self.panneau.winfo_width()*0.8)
+      self.label = Label(self,text=texte,wraplength=longueur,justify='center')
+      self.label.place(relx=0.5,rely=0.4,relwidth=0.8,anchor='center')
+      self.bouton_sup = Button(self,
+                               text = "Supprimer",
+                               command=self.supprimer,
+                               width=14)
+      self.bouton_sup.place(relx=0.5,rely=0.8,anchor='center')
+
+
+if __name__ == "__main__" : pass
diff --git a/InterfaceTK/panelsSalome.py b/InterfaceTK/panelsSalome.py
new file mode 100644 (file)
index 0000000..6381ba7
--- /dev/null
@@ -0,0 +1,286 @@
+# -*- coding: utf-8 -*-
+print "Import de panelsSalome"
+
+from Tkinter import *
+from widgets import ListeChoix
+from widgets import showerror
+
+from fonctionpanel      import FONCTION_Panel
+from shellpanel         import SHELLPanel
+from plusieursintopanel import PLUSIEURS_INTO_Panel
+from plusieursassdpanel import PLUSIEURS_ASSD_Panel
+from plusieursbasepanel import PLUSIEURS_BASE_Panel
+from plusieursbasepanel import PLUSIEURS_BASE_OR_UNELISTE_Panel
+from uniquesdcopanel    import UNIQUE_SDCO_Panel
+from uniqueassdpanel    import UNIQUE_ASSD_Panel
+from uniqueintopanel    import UNIQUE_INTO_Panel
+from uniquecomppanel    import UNIQUE_COMP_Panel
+from uniquebasepanel    import UNIQUE_BASE_Panel
+from uniqueassdpanel    import UNIQUE_ASSD_Panel_Reel
+
+from Noyau.N_CR import justify_text
+
+import traceback
+import salome           # CS_pbruno à poubelliser
+import images
+
+
+
+# 2 types de commandes vont etre particularisees dans Salome
+#
+# - un cas general : 
+# Toutes les commandes possedant GROUP_NO ou GROUP_MA
+# seront surchargees d office
+# pour cela on va utiliser le dictionnaire dict_classes_salome
+# qui va permettre de changer la classe de la commande
+# ainsi si un panel en dehors de salome a pour classe PLUSIEURS_BASE_Panel
+# la classe de ce panel devient alors SALOME_PLUSIEURS_BASE_Panel
+# (pour cela voir composimp)
+
+# des commandes "autres" ne pouvant pas etre identifiées par leur nom 
+# il suffit de creer dans la classe SALOME de la commande
+# une fonction portant son nom 
+# Exemple de particularisation d un panel :
+# Supposons que l on veuille particulariser la commande
+#        - LIRE_MAILLAGE_UNITE 
+# le panel initial a pour classe UNIQUE_BASE_Panel
+# il suffit d'ajouter dans la classe derivée SALOME_UNIQUE_BASE_Panel
+# une fonction  SALOME_LIRE_MAILLAGE_UNITE
+# la classe de ce panel devient alors SALOME_UNIQUE_BASE_Panel
+# on peut surcharger les methodes nécessaires (affichage par exemple)  
+
+
+class SALOME_SHELLPanel (SHELLPanel):
+        ""
+
+class SALOME_FONCTION_Panel (FONCTION_Panel):
+        ""
+
+class SALOME_PLUSIEURS_INTO_Panel (PLUSIEURS_INTO_Panel):
+        ""
+
+class SALOME_PLUSIEURS_ASSD_Panel (PLUSIEURS_ASSD_Panel):
+        ""
+
+class SALOME_UNIQUE_INTO_Panel (UNIQUE_INTO_Panel):
+        ""
+
+class SALOME_UNIQUE_SDCO_Panel (UNIQUE_SDCO_Panel):
+        ""
+
+class SALOME_UNIQUE_ASSD_Panel (UNIQUE_ASSD_Panel):
+        ""
+
+class SALOME_UNIQUE_COMP_Panel (UNIQUE_COMP_Panel):
+        ""
+
+class SALOME_UNIQUE_ASSD_Panel_Reel (UNIQUE_ASSD_Panel_Reel):
+        ""
+
+# ------------------------------------------------------------------------------#
+# classe SALOME_PLUSIEURS_BASE_Panel
+#
+# Commandes modifiées  :  
+#        - AFFE_CHAR_MECA_DDL_IMPO_GROUP_NO
+# Methodes surchargées :  
+#        - makeValeurPage(self,page)
+#
+# ------------------------------------------------------------------------------#
+
+class SALOME_PLUSIEURS_BASE_OR_UNELISTE_Panel(PLUSIEURS_BASE_OR_UNELISTE_Panel):
+      ""        
+
+class SALOME_PLUSIEURS_BASE_Panel(PLUSIEURS_BASE_Panel):
+
+  def __init__(self,parent,panneau,node):
+      PLUSIEURS_BASE_Panel.__init__( self, parent, panneau, node )
+      #self.selected_valeur = None
+      
+  def add_valeur_plusieurs_base(self,name=None):
+      try: 
+        valeur,validite,commentaire=self.get_valeur()
+        if not valeur: # sélection dans salome        
+            strSelection = ''
+            
+            genea=self.node.item.get_genealogie()
+            kwType = None
+            for e in genea:
+                if "GROUP_NO" in e:
+                    kwType = "GROUP_NO"
+                if "GROUP_MA" in e:
+                    kwType = "GROUP_MA"            
+                
+            selection, msg = self.parent.appli.selectGroupFromSalome(kwType)
+            if selection:
+                for oneSelection in selection:
+                    strSelection +=str( oneSelection )
+                    strSelection +=','
+                            
+                strSelection = strSelection.rstrip(',')
+                self.display_valeur( strSelection )                
+                    
+        PLUSIEURS_BASE_Panel.add_valeur_plusieurs_base( self, name )
+        if msg:
+            self.parent.appli.affiche_infos(msg)
+        self.erase_valeur()
+      except:
+        print ' erreur  add_valeur_plusieurs_base' #CS_pbruno : afficher boite de dialogue ici ?          
+        
+  def makeValeurPage(self,page):
+      """
+      Crée la page de saisie d'une liste de valeurs à priori quelconques,
+      cad qui ne sont  pas à choisir dans une liste prédéfinie
+      """      
+      PLUSIEURS_BASE_Panel.makeValeurPage(self,page)
+      self.c = Button( self.frame_choix, text='Visualiser',command=self.displayInSalomeGeom )      
+      self.c.place( relx=0.3, rely=0.0,relwidth=0.55)
+      
+      
+  def displayInSalomeGeom( self ):
+      if self.selected_valeur:        
+        ok, msgError = self.parent.appli.displayShape( self.selected_valeur )
+        if not ok:
+            self.parent.appli.affiche_infos(msgError)
+      
+      
+
+
+# ------------------------------------------------------------------------------#
+# classe SALOME_UNIQUE_BASE_Panel
+#
+# Commandes modifiées  :  
+#        - LIRE_MAILLAGE_UNITE 
+# Methodes surchargées :  
+#        - makeValeurPage(self,page)
+#
+# ------------------------------------------------------------------------------#
+
+class SALOME_UNIQUE_BASE_Panel(UNIQUE_BASE_Panel):
+
+# ce dictionnaire va servir lors de la sortie d efficas
+# a creer le fichier qui sera integre au config.txt
+# pour relier une unite logique et un nom de fichier
+
+  dict_fichier_unite={}
+
+
+  def SALOME_DONNEES_HOMARD_FICHIER_MED_MAILLAGE_N(self):
+      entrychaine=salome.sg.getAllSelected()
+      if entrychaine != '':
+          self.entry2.delete(0,END)
+          try:
+              SO = salome.myStudy.FindObjectID(entrychaine[0])
+          except:
+              boo = 0
+              SO = None
+
+          FileName=''
+          if SO != None:
+              myBuilder = salome.myStudy.NewBuilder()
+              boo,FileAttr = myBuilder.FindAttribute(SO,"AttributeFileType")
+              if boo:
+                 val=FileAttr.Value()
+                 if (val !="FICHIERMED" and val != "FICHIER_RESU_MED"):
+                     boo=0
+                     showerror("Pas de Fichier MED","Cet Objet n a pas de fichier MED Associ\xe9")
+                 else:
+                     boo,FileAttr = myBuilder.FindAttribute(SO,"AttributeExternalFileDef")
+              if boo :
+                FileName=FileAttr.Value()
+              else:
+                 showerror("Pas de Fichier MED","Cet Objet n a pas de fichier MED Associ\xe9")
+          if FileName != '' :
+              self.entry.delete(0,END)
+              self.entry2.delete(0,END)
+              self.entry.insert(0,FileName)
+              self.entry2.insert(0,FileName)
+              self.valid_valeur()
+
+
+  def SALOME_DONNEES_HOMARD_TRAITEMENT_NOM_MED_MAILLAGE_N(self):
+      EntryName=''
+      entrychaine=salome.sg.getAllSelected()
+      if entrychaine != '':
+          self.entry2.delete(0,END)
+          try:
+              SO = salome.myStudy.FindObjectID(entrychaine[0])
+          except:
+              boo = 0
+              SO = None
+
+          if SO is not None:
+             myBuilder = salome.myStudy.NewBuilder()
+             ok, AtName = myBuilder.FindAttribute(SO,"AttributeName")
+             if ok:
+                EntryName=AtName.Value()
+
+      if EntryName != '':
+          self.entry.delete(0,END)
+          self.entry2.delete(0,END)
+          self.entry.insert(0,EntryName)
+          self.entry2.insert(0,EntryName)
+          self.valid_valeur()
+
+  def SALOME_DONNEES_HOMARD_FICHIER_MED_MAILLAGE_NP1(self):
+      self.SALOME_DONNEES_HOMARD_FICHIER_MED_MAILLAGE_N()
+
+  def SALOME_DEFI_GROUP_CREA_GROUP_MA_GROUP_MA(self):
+      #try: 
+      if ( 1 == 1 ) :
+        selection, msg = self.parent.appli.selectGroupFromSalome()
+        if selection:
+           strSelection =str( selection )
+           UNIQUE_BASE_Panel.valid_valeur(self,strSelection)
+        if msg:
+            self.parent.appli.affiche_infos(msg)
+        self.erase_valeur()
+      #except:
+      else :
+        print ' erreur  '
+        
+
+  def redistribue_selon_simp(self):
+      genea = self.node.item.get_genealogie()
+      commande="SALOME"
+      for i in range(0,len( genea )) :
+        commande=commande+"_"+ genea[i]
+      # --------------------------------------------------------------
+      # on verifie que la methode n est pas particularise
+      # sinon on appelle SALOME_DEFI_GROUP_CREA_GROUP_MA_GROUP_MA qui
+      # sert comme methode par defaut 
+      # --------------------------------------------------------------
+      try :
+        SALOME_UNIQUE_BASE_Panel.__dict__[commande](self)
+      except :
+         SALOME_UNIQUE_BASE_Panel.SALOME_DEFI_GROUP_CREA_GROUP_MA_GROUP_MA(self)
+
+
+
+  def makeValeurPage(self,page):
+      """
+      Crée la page de saisie d'une valeur à priori quelconque,
+      cad qui ne sont  pas à choisir dans une liste prédéfinie
+      Ajout d'un bouton pour selectionner  à partir de Salome  
+      """      
+      UNIQUE_BASE_Panel.makeValeurPage(self,page)
+      self.b = Button(self.frame_valeur,text='Relier selection',command=self.redistribue_selon_simp)
+      self.b.place(relx=0.28,rely=0.4,relwidth=0.4)
+
+#---------------------------------------------------------------------------------------
+# Correspondances entre les classes eficas et les classes salome_eficas 
+#______________________________________________________________________________________
+dict_classes_salome = { SHELLPanel : SALOME_SHELLPanel, 
+                          FONCTION_Panel       : SALOME_FONCTION_Panel,
+                          PLUSIEURS_INTO_Panel : SALOME_PLUSIEURS_INTO_Panel,
+                          PLUSIEURS_ASSD_Panel : SALOME_PLUSIEURS_ASSD_Panel,
+                          PLUSIEURS_BASE_Panel : SALOME_PLUSIEURS_BASE_Panel,
+                          PLUSIEURS_BASE_OR_UNELISTE_Panel : SALOME_PLUSIEURS_BASE_OR_UNELISTE_Panel,
+                          UNIQUE_INTO_Panel :  SALOME_UNIQUE_INTO_Panel,
+                          UNIQUE_SDCO_Panel : SALOME_UNIQUE_SDCO_Panel,
+                          UNIQUE_ASSD_Panel : SALOME_UNIQUE_ASSD_Panel,
+                          UNIQUE_ASSD_Panel_Reel : SALOME_UNIQUE_ASSD_Panel_Reel,
+                          UNIQUE_COMP_Panel : SALOME_UNIQUE_COMP_Panel,
+                          UNIQUE_BASE_Panel : SALOME_UNIQUE_BASE_Panel}
+
+dict_geom_numgroupe = { }
+dict_geom_numface = { }
diff --git a/InterfaceTK/patches.py b/InterfaceTK/patches.py
new file mode 100644 (file)
index 0000000..0bd2fc4
--- /dev/null
@@ -0,0 +1,39 @@
+# -*- 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 contient des modifications mineures du comportement
+   du noyau ou de validation
+"""
+import string
+
+if __name__ == "__main__":
+   import Noyau.N_CR
+   print Noyau.N_CR.encadre_message(motif='!',
+texte="""- Il faut au moins un mot-clé parmi : ('DEBUT', 'POURSUITE')     
+- Il faut au moins un mot-clé parmi : ('FIN',)               
+- Il faut qu'au moins un objet de la liste : ('DEBUT', 'POURSUITE') soit suivi d'au moins un objet de la liste : ('FIN',) 
+ddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddd
+xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx,yyyyyyyyyyyyyyyy
+""")
+
+
+
diff --git a/InterfaceTK/plusieursassdpanel.py b/InterfaceTK/plusieursassdpanel.py
new file mode 100644 (file)
index 0000000..3d77f39
--- /dev/null
@@ -0,0 +1,183 @@
+# -*- 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 Tkinter import *
+import Pmw
+from copy import copy,deepcopy
+import traceback
+
+# Modules Eficas
+from Editeur import Objecttreeitem
+from Aster import prefs
+import panels
+import images
+from widgets import ListeChoix
+from widgets import FenetreDeSelection
+
+from Noyau.N_CR import justify_text
+from Editeur.utils import substract_list
+
+# Import des panels
+from plusieurspanel import PLUSIEURS_Panel 
+
+class PLUSIEURS_ASSD_Panel(PLUSIEURS_Panel):
+  """
+  Classe définissant le panel associé aux mots-clés qui demandent
+  à l'utilisateur de donner une liste de valeurs qui ne sont pas
+  à choisir dans une liste discrètes et qui sont de type dérivé d'ASSD
+  """
+  def makeValeurPage(self,page):
+      """
+      Génère la page de saisie de plusieurs noms de SD parmi un ensemble discret
+      de SD possibles, cad d'un type cohérent avec les types attendus par le mot-clé simple
+      """
+      # On récupère la bulle d'aide du panneau, l'objet, l'aide, min et max (cardinalité de la liste),
+      # la liste des valeurs déjà affectées à l'objet courant et la liste des SD du bon type
+      bulle_aide=self.get_bulle_aide()
+      self.ajout_valeurs=None
+      objet_mc = self.node.item.get_definition()
+      aide = self.get_aide()
+      aide = justify_text(texte=aide)
+      min,max = self.node.item.GetMinMax()
+      l_valeurs = self.node.item.GetListeValeurs()
+      l_choix=self.node.item.get_sd_avant_du_bon_type()
+      l_choix.sort()
+      # remplissage du panneau
+      self.frame_valeurs = Frame(page)
+      self.frame_valeurs.place(relx=0.05,rely=0.05,relwidth=0.35,relheight=0.7)
+      self.frame_boutons_fleches = Frame(page)
+      self.frame_boutons_fleches.place(relx=0.4,rely=0.,relwidth=0.2,relheight=0.7)
+      self.frame_choix = Frame(page)
+      self.frame_choix.place(relx=0.6,rely=0.05,relwidth=0.35,relheight=0.7)
+      self.frame_boutons = Frame(page)
+      self.frame_boutons.place(relx=0.35,rely=0.87,relwidth=0.5,relheight=0.1)
+      liste_commandes_valeurs = (("<Button-1>",self.selectValeur),
+                                 ("<Button-3>",self.deselectValeur),
+                                 ("<Double-Button-1>",self.sup_valeur_sans_into))
+      liste_commandes_choix = (("<Button-1>",self.selectChoix),
+                               ("<Button-3>",self.deselectChoix),
+                               ("<Double-Button-1>",self.add_eval_valeur_sans_into))
+      self.Liste_valeurs = ListeChoix(self,self.frame_valeurs,l_valeurs,liste_commandes = liste_commandes_valeurs,
+                                      titre="Valeur(s) actuelle(s)")
+      self.Liste_choix = ListeChoix(self,self.frame_choix,l_choix,liste_commandes = liste_commandes_choix,
+                                    titre= "Valeurs possibles")
+      self.bouton_add = Button(self.frame_boutons_fleches,
+                          image = images.get_image('arrow_left'),
+                          command = self.add_eval_valeur_sans_into)
+      self.bouton_sup = Button(self.frame_boutons_fleches,
+                          image = images.get_image('arrow_right'),
+                          command = self.sup_valeur_sans_into)
+      self.bouton_accepter = Button(self.frame_boutons,
+                               text='Valider',
+                               command = lambda s=self,m=min,M=max : s.accepte_modifs_valeur(m,M))
+      self.bouton_annuler = Button(self.frame_boutons,
+                              text = 'Annuler',
+                              command = self.annule_modifs_valeur)
+      self.bouton_add.place(relx=0.3,rely=0.35)
+      self.bouton_sup.place(relx=0.3,rely=0.65)
+      for but in (self.bouton_accepter,self.bouton_annuler):
+          but.pack(side='left',padx=4)
+      self.Liste_valeurs.affiche_liste()
+      if len(l_valeurs) > 0 :
+          liste_marque=l_valeurs[-1]
+          self.Liste_valeurs.surligne(liste_marque)
+      self.Liste_choix.affiche_liste()
+      for fram in (self.frame_valeurs,self.frame_boutons_fleches,self.frame_choix,self.frame_boutons):
+          fram.bind("<Button-3>",lambda e,s=self,a=bulle_aide : s.parent.appli.affiche_aide(e,a))
+          fram.bind("<ButtonRelease-3>",self.parent.appli.efface_aide)
+  
+  def add_eval_valeur_sans_into(self,valeurentree=None):
+      if valeurentree == None:
+         valeurentree = self.get_valeur()
+      valeur,validite=self.node.item.eval_valeur(valeurentree)
+      if not validite :
+         commentaire = "impossible d'évaluer : %s " %`valeurentree`
+         self.parent.appli.affiche_infos(commentaire)
+         return
+      self.add_valeur_sans_into(valeur)
+
+  def get_bulle_aide(self):
+      """
+      Retourne la bulle d'aide associée au panneau
+      """
+      return """Un clic sur une valeur des deux listes la sélectionne.
+      - Un clic sur la flèche gauche stocke la valeur possible sélectionnée
+      dans la liste des valeurs que vous voulez affecter au mot-clé simple
+      - Un clic sur la flèche droite déstocke la valeur du mot-clé simple
+      sélectionnée (elle apparaît alors à nouveau comme choix possible
+      dans la liste des choix à droite)
+      - Cliquez sur 'Valider' pour affecter la liste des valeurs sélectionnées
+      au mot-clé simple courant
+      - Cliquez sur 'Annuler' pour restaurer la valeur du mot-clé simple
+      avant toute modification depuis le dernier 'Valider'"""
+
+  def get_aide(self):
+      """
+      Retourne la phrase d'aide indiquant de quel type doivent être les
+      valeurs que doit entrer l'utilisateur
+      """
+      commentaire=""
+      mc = self.node.item.get_definition()
+      type = mc.type[0].__name__  
+      if len(mc.type)>1 :
+          for typ in mc.type[1:] :
+              type = type + ' ou '+typ.__name__
+      if mc.min == mc.max:
+        commentaire="Une liste de "+`mc.min`+" objets de type "+type+" est attendue"
+      else :
+        commentaire="Une liste d'objets de type "+type+" est attendue (min="+`mc.min`+",max="+`mc.max`+')'
+      aideval=self.node.item.aide()
+      commentaire=commentaire +"\n"+ aideval
+      return commentaire
+
+    
+  def sup_valeur(self,name=None):
+      """
+      Supprime la valeur selectionnée de la liste des valeurs et la rajoute
+      à la liste des choix possibles
+      """
+      liste_valeurs = self.Liste_valeurs.get_liste()
+      liste_valeurs.remove(self.selected_valeur)
+      liste_choix = self.node.item.get_definition().into
+      liste_choix = substract_list(liste_choix,liste_valeurs)
+      self.Liste_valeurs.put_liste(liste_valeurs)
+      self.Liste_choix.put_liste(liste_choix)
+      self.selected_valeur = None      
+    
+  def erase_valeur(self):
+      pass
+
+  def get_valeur(self):
+      """
+      Retourne la valeur sélectionnée dans la liste des choix
+      """
+      return self.selected_choix
+
+  def display_valeur(self,val=None):
+      """
+         Affiche la valeur passée en argument dans l'entry de saisie.
+         Par défaut affiche la valeur du mot-clé simple
+      """
+      # Il n'y a pas d'entry pour ce type de panneau
+      return
+
+    
diff --git a/InterfaceTK/plusieursbasepanel.py b/InterfaceTK/plusieursbasepanel.py
new file mode 100644 (file)
index 0000000..550b98e
--- /dev/null
@@ -0,0 +1,542 @@
+# -*- 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 Tkinter import *
+import Pmw
+from copy import copy,deepcopy
+import traceback
+
+# Modules Eficas
+from Editeur import Objecttreeitem
+from Aster import prefs
+import panels
+import images
+from widgets import showinfo
+from widgets import askopenfilename
+from widgets import ListeChoix
+from widgets import FenetreDeSelection
+from widgets import FenetreDeParametre
+
+from Noyau.N_CR import justify_text
+from Ihm.I_LASSD import LASSD
+from Extensions.parametre import PARAMETRE
+
+from Editeur.utils import substract_list
+from plusieurspanel import PLUSIEURS_Panel
+from uniqueassdpanel import UNIQUE_ASSD_Panel
+
+from InterfaceTK import fontes
+import math
+
+class PLUSIEURS_BASE_Panel(PLUSIEURS_Panel):
+  """
+  Classe définissant le panel associé aux mots-clés qui demandent
+  à l'utilisateur de donner une liste de valeurs qui ne sont pas
+  à choisir dans une liste discrètes et qui sont de type de base :
+  entier, réel, string,...
+  """
+  def makeValeurPage(self,page):
+      """
+      Crée la page de saisie d'une liste de valeurs à priori quelconques,
+      cad qui ne sont  pas à choisir dans une liste prédéfinie
+      """
+      #print "Methode Utilisée par Salome"
+      # On récupère la bulle d'aide du panneau, l'objet, l'aide,min et max (cardinalité de la liste),
+      # et la liste des valeurs déjà affectées à l'objet courant
+      bulle_aide=self.get_bulle_aide()
+      objet_mc = self.node.item.get_definition()
+      aide = self.get_aide()
+      aide = justify_text(texte=aide)
+      min,max = self.node.item.GetMinMax()
+      l_valeurs = self.node.item.GetListeValeurs()
+
+      # création des frames globales
+      self.frame1 = Frame(page,relief='groove',bd=2)
+      self.frame2 = Frame(page)
+      self.frame1.place(relx=0.,rely=0.,relwidth=1.,relheight=0.85)
+      self.frame2.place(relx=0.,rely=0.85,relwidth=1,relheight=0.15)
+      self.frame_right = Frame(self.frame1)
+      self.frame_right.place(relx=0.35,rely=0.,relwidth=0.65,relheight=1.)
+
+      # création des frames internes
+      self.frame_valeurs = Frame(self.frame1)
+      self.frame_valeurs.place(relx=0.02,rely=0.05,relwidth=0.35,relheight=0.95)
+      self.frame_boutons_fleches = Frame(self.frame_right)
+      self.frame_boutons_fleches.place(relx=0.,rely=0.2,relwidth=0.2,relheight=0.5)
+      self.frame_choix = Frame(self.frame_right)
+      self.frame_choix.place(relx=0.2,rely=0.2,relwidth=0.7,relheight=0.8)
+      self.frame_aide = Frame(self.frame_right)
+      self.frame_aide.place(relx=0.1,rely=0.8,relwidth=0.8,relheight=0.2)
+      self.frame_boutons = Frame(self.frame2)
+      self.frame_boutons.place(relx=0.2,rely=0.,relwidth=1,relheight=1.)
+      for fram in (self.frame1,self.frame2,self.frame_right,self.frame_valeurs,
+                 self.frame_boutons_fleches,self.frame_choix,self.frame_aide,self.frame_boutons):
+          fram.bind("<Button-3>",lambda e,s=self,a=bulle_aide : s.parent.appli.affiche_aide(e,a))
+          fram.bind("<ButtonRelease-3>",self.parent.appli.efface_aide)
+
+      # création des objets dans les frames
+      liste_commandes_valeurs = (("<Button-1>",self.selectValeur),
+                                 ("<Button-3>",self.deselectValeur),
+                                 ("<Double-Button-1>",self.sup_valeur_sans_into))
+      self.Liste_valeurs=ListeChoix(self,self.frame_valeurs,l_valeurs,liste_commandes = liste_commandes_valeurs,
+                                      titre="Valeur(s) actuelle(s)")
+
+      # Création de l'entry ou de la liste des SD
+      # PN : pour ajouter les validators
+      self.label = Label(self.frame_choix,text="Valeur :")
+      self.make_entry(frame = self.frame_choix,command = self.add_valeur_plusieurs_base)
+      self.label.place(relx=0.05,rely=0.2)
+
+      # Création d'un bouton "Importer ..." et d'un bouton "Paramatres" sur le panel.
+      bouton_valeurs_fichier = Button(self.frame_choix,
+                                      text="Importer",
+                                      command=self.select_in_file)
+      bouton_valeurs_fichier.place(relx=0.28,rely=0.4,relwidth=0.6)
+      bouton_parametres = Button(self.frame_choix, text="Parametres", command=self.affiche_parametre)
+      bouton_parametres.place(relx=0.28,rely=0.6,relwidth=0.6)
+      self.ajout_valeurs = None
+
+      # boutons Ajouter et Supprimer
+      self.bouton_add = Button(self.frame_boutons_fleches,
+                          image = images.get_image('arrow_left'),
+                          command = self.add_valeur_plusieurs_base)
+      self.bouton_sup = Button(self.frame_boutons_fleches,
+                          image = images.get_image('arrow_right'),
+                          command = self.sup_valeur_sans_into)
+      self.bouton_add.place(relx=0.3,rely=0.35)
+      self.bouton_sup.place(relx=0.3,rely=0.65)
+      # affichage de l'aide
+      self.frame_aide.update()
+      self.aide = Label(self.frame_aide,
+                        text = aide,
+                        justify='center',
+                        anchor='center',
+                              wraplength=int(self.frame_aide.winfo_width()*0.8))
+      self.aide.place(relx=0.5,rely=0.5,anchor='center',relwidth=1)
+      self.Liste_valeurs.affiche_liste()
+      if len(l_valeurs) > 0 :
+          liste_marque=l_valeurs[-1]
+          self.Liste_valeurs.surligne(liste_marque)
+          self.selectValeur(liste_marque)
+      # boutons Accepter et Annuler
+      self.bouton_accepter = Button(self.frame_boutons,
+                               text='Valider',
+                               command = lambda s=self,m=min,M=max : s.accepte_modifs_valeur(m,M))
+      self.bouton_annuler = Button(self.frame_boutons,
+                              text = 'Annuler',
+                              command = self.annule_modifs_valeur)
+      self.bouton_accepter.place(relx=0.2, rely=0.2,relwidth=0.25)
+      self.bouton_annuler.place(relx=0.5, rely=0.2,relwidth=0.25)
+
+  def affiche_parametre(self) :
+      if self.node.item.get_liste_param_possible() != [ ]:
+         txtparam=""
+         for param in self.node.item.get_liste_param_possible():
+            txtparam=txtparam+repr(param)+"\n"
+         if txtparam=="":
+            showerror("Aucun parametre ","Pas de parametre de ce type")
+         else :
+            try :
+                    self.self.fenetreparam.destroy()
+            except:
+                pass
+            self.fenetreparam=FenetreDeParametre( self, self.node.item, self.parent.appli, txtparam)
+
+  def valid_valeur(self):
+      self.add_valeur_plusieurs_base()
+
+  def add_valeur_plusieurs_base(self,name=None):
+      if name != None :
+         valeur = name
+      else:
+         valeur,validite,commentaire=self.get_valeur()
+         if not validite :
+            self.parent.appli.affiche_infos(commentaire)
+            return
+
+      atraiter=[]
+      if type(valeur)  in (types.ListType,types.TupleType) :
+         indice = 0
+         while (indice < len(valeur)):
+            v=valeur[indice]
+            if self.node.item.wait_complex :
+               if (v== 'RI' or v == 'MP'):
+                  try :
+                     t=tuple([v,valeur[indice+1],valeur[indice+2]])
+                     atraiter.append(t)
+                     indice=indice+3
+                  except :
+                     validite=0
+                     commentaire = "Veuillez entrer le complexe sous forme aster ou sous forme python"
+                     self.parent.appli.affiche_infos(commentaire)
+                     return
+               else :     # ce n'est pas un tuple à la mode aster
+                  atraiter.append(v)
+                  indice = indice + 1
+            else:  # on n'attend pas un complexe
+              atraiter.append(v)
+              indice=indice+1
+      else:
+         atraiter.append(valeur)
+         
+      for valeur in atraiter :
+         encorevalide=self.node.item.valide_item(valeur)
+         if encorevalide :
+            listecourante=self.Liste_valeurs.get_liste()
+            encorevalide=self.node.item.valide_liste_partielle(valeur,listecourante)
+            if not encorevalide : encorevalide = -1
+         self.add_valeur_sans_into(valeur,encorevalide)
+    
+  def select_in_file(self):
+      """ Permet d'ouvrir un fichier choisi par l'utilisateur. """
+      nom_fichier = askopenfilename(title="Choix fichier :")
+
+      if not nom_fichier:
+          return
+
+      try:
+          f = open(nom_fichier, "rb")
+          selection_texte = f.read()
+          f.close()
+          self.ajout_valeurs = FenetreDeSelection(self, 
+                                                  self.node.item,
+                                                  self.parent.appli,
+                                                  titre="Sélection de valeurs",
+                                                  texte=selection_texte)
+      except:
+          traceback.print_exc()
+          showinfo("Erreur de fichier","impossible d'ouvir le fichier "+nom_fichier)
+          
+  def get_bulle_aide(self):
+      """
+      Retourne l'aide associée au panneau courant
+      """
+      return """Taper dans la boîte de saisie de droite la valeur que
+      vous voulez affecter au mot-clé simple.
+      - Cliquez sur la flèche gauche ou pressez <Return> pour la faire glisser
+      dans la liste des valeurs que vous voulez affecter au mot-clé simple
+      - Un clic sur une valeur de la liste la sélectionne
+      - Un clic sur la flèche droite ou un double-clic retire la valeur
+      sélectionnée de la liste
+      - Cliquez sur 'Valider' pour que la nouvelle valeur désirée soit affectée
+      au mot-clé simple
+      - Cliquez sur 'Annuler' pour annuler toutes les modifications faites
+      depuis le dernier clic sur 'Valider'"""
+
+  def get_aide(self):
+      """
+      Retourne la phrase d'aide indiquant de quel type de base doivent être les valeurs
+      que saisit l'utilisateur
+      """
+      commentaire=""
+      mc = self.node.item.get_definition()
+      d_aides = { 'TXM' : 'chaînes de caractères',
+                  'R'   : 'réels',
+                  'I'   : 'entiers',
+                  'C'   : 'complexes'}
+      type = mc.type[0]
+      if not d_aides.has_key(type) : return 'Type de base inconnu'
+      if mc.min == mc.max:
+          commentaire="Une liste de "+d_aides[type]+" de longueur " + `mc.min`  + " est attendue"
+      else :
+          commentaire="Une liste de "+d_aides[type]+" est attendue (min="+`mc.min`+",max="+`mc.max`+')'
+
+      aideval=self.node.item.aide()
+      commentaire=commentaire +"\n"+aideval
+      return commentaire
+
+  def make_entry(self,frame,command,x=0.28,y=0.2):
+      self.entry = Entry(frame,relief='sunken')
+      self.entry.place(relx=0.28,rely=y,relwidth=0.6)
+      self.entry.bind("<Return>",lambda e,c=command:c())
+      self.entry.bind("<KP_Enter>",lambda e,c=command:c())
+      self.entry.focus()
+
+  def get_valeur(self):
+      """
+      Retourne la valeur saisie par l'utilisateur dans self.entry
+      """
+      commentaire = ""
+      if hasattr(self,'entry'):
+         # Traitement d'une entree unique
+         valeurentree = self.entry.get()
+         if (valeurentree == None or valeurentree ==""):
+            return None,0,""
+
+         #On tente une evaluation globale (ne fait pas de vérification de validité
+         #seulement une transformation de la chaine en objet équivalent)
+         valeur,validite=self.node.item.eval_valeur(valeurentree)
+         if valeur == valeurentree:
+             #L'evaluation n'a rien donné : on a toujours la string
+             #on découpe la string sur le séparateur , si c'est possible
+             if valeurentree.find(',') != -1:
+                 valeur=[]
+                 for v in valeurentree.split(','):
+                     vsimple,validite=self.node.item.eval_valeur(v)
+                     valeur.append(vsimple)
+
+         return valeur,validite,commentaire
+
+
+        # if (valeurentree[0] != "(") and (valeurentree.find(',') < len(valeurentree)):
+        #    valeurs=[]
+        #    for v in valeurentree.split(','):
+        #      vsimple,validite=self.node.item.eval_valeur(v)
+              # Pn If ajoute  pour le panneau "double"
+              #if isinstance(vsimple,LASSD) : 
+              #         commentaire = "impossible de mélanger reels et liste prédéfinie"
+              #  validite = 0
+              #         break 
+        #      if validite :
+        #         valeurs.append(vsimple)
+        #      else:
+        #         commentaire = "impossible d'évaluer : %s " %`valeurentree`
+        #         break
+        #    valeur=valeurs
+        # else: 
+        #    valeur,validite=self.node.item.eval_valeur(valeurentree)
+        # if not validite and commentaire == "":
+        #    commentaire = "impossible d'évaluer : %s " %`valeurentree`
+        # return valeur,validite,commentaire
+      #else:
+      #   # Traitement d'une entree de type complexe
+      #   try:
+      #      valeur= (self.typ_cplx.get(),
+      #               string.atof(self.entry1.get()),
+      #               string.atof(self.entry2.get()))
+      #      return valeur,1,""
+      #   except:
+      #      #traceback.print_exc()
+      #      return None,0,"impossible d'évaluer la valeur d'entree"
+
+  def erase_valeur(self):
+      """
+      Efface la valeur donnée par l'utilisateur dans l'entry
+      """
+      if hasattr(self,'entry'):
+         self.entry.delete(0,END)
+      else:
+         self.typ_cplx.set('RI')
+         self.entry1.delete(0,END)
+         self.entry2.delete(0,END)
+
+        
+  def display_valeur(self,val=None):
+      """
+      Affiche la valeur passée en argument dans l'entry de saisie.
+      Par défaut affiche la valeur du mot-clé simple
+      """
+      if not val :
+          valeur = self.node.item.object.getval()
+      else:
+          valeur = val
+      if not valeur : return
+
+      if hasattr(self,'entry'):
+         # Traitement d'une entree unique
+         self.entry.delete(0,END)
+         self.entry.insert(0,str(valeur))
+      else:
+         # Traitement d'une entree de type complexe
+         typ_cplx,x1,x2=valeur
+         self.entry1.delete(0,END)
+         self.entry2.delete(0,END)
+         self.typ_cplx.set(typ_cplx)
+         self.entry1.setentry(x1)
+         self.entry2.setentry(x2)
+
+class PLUSIEURS_BASE_OR_UNELISTE_Panel(PLUSIEURS_BASE_Panel,UNIQUE_ASSD_Panel):
+
+  def makeValeurPage(self,page):
+      """
+      Crée la page de saisie d'une liste de valeurs à priori quelconques,
+      cad qui ne sont  pas à choisir dans une liste prédéfinie
+      """
+      # On récupère la bulle d'aide du panneau, l'objet, l'aide,min et max (cardinalité de la liste),
+      # et la liste des valeurs déjà affectées à l'objet courant
+      bulle_aide=self.get_bulle_aide()
+      objet_mc = self.node.item.get_definition()
+      aide = self.get_aide()
+      aide = justify_text(texte=aide)
+      aide2 = self.get_aide2()
+      aide2 = justify_text(texte=aide2)
+      min,max = self.node.item.GetMinMax()
+      l_valeurs = self.node.item.GetListeValeurs()
+      for i in l_valeurs:
+         if isinstance(i,LASSD) :
+            affiche_entry=l_valeurs
+            l_valeurs=()
+
+      # Il faut traiter ici pour avoir le choix entre une liste
+      # deja constituee (listr8aster) ou manuelle
+
+      # création des frames globales
+      self.frame1 = Frame(page,relief='groove',bd=2)
+      self.frame2 = Frame(page)
+      self.frame1.place(relx=0.,rely=0.,relwidth=1.,relheight=0.9)
+      self.frame2.place(relx=0.,rely=0.9,relwidth=1,relheight=0.1)
+
+      # création des frames internes dans frame1
+      self.frame_valeurs = Frame(self.frame1)
+      self.frame_valeurs.place(relx=0.02,rely=0.55,relwidth=0.35,relheight=0.45)
+      self.frame_haut = Frame(self.frame1)
+      self.frame_haut.place(relx=0.02,rely=0.02,relwidth=0.98,relheight=0.45)
+      self.frame_bas = Frame(self.frame1)
+      self.frame_bas.place(relx=0.37,rely=0.55,relwidth=0.63,relheight=0.45)
+
+      # création des frames internes dans frame_right
+      self.frame_fleches = Frame(self.frame_bas)
+      self.frame_fleches.place(relx=0.,rely=0.4,relwidth=0.2,relheight=0.5)
+      self.frame_choix = Frame(self.frame_bas)
+      self.frame_choix.place(relx=0.2,rely=0.1,relwidth=0.75,relheight=1)
+
+      # affichage de l'aide
+      self.aide = Label(self.frame_haut, text = aide, justify='center', anchor='center',)
+      self.aide.place(relx=0.72,rely=0.25,anchor='center',relwidth=1)
+      self.aide2 = Label(self.frame2, text = aide2,)
+      self.aide2.place(relx=0.4,rely=0.01,relwidth=0.6)
+
+      # Création d'un bouton "Importer ..." et d'un bouton "Parametres" sur le panel.
+      bouton_valeurs_fichier = Button(self.frame_choix,
+                                      text="Importer",
+                                      command=self.select_in_file)
+      bouton_valeurs_fichier.place(relx=0.28,rely=0.0,relwidth=0.6)
+      bouton_parametres = Button(self.frame_choix, text="Parametres", command=self.affiche_parametre)
+      bouton_parametres.place(relx=0.28,rely=0.25,relwidth=0.6)
+      self.ajout_valeurs = None
+
+
+      # Création de la liste des SD
+      liste_noms_sd = self.node.item.get_sd_avant_du_bon_type_pour_type_de_base()
+      liste_noms_sd = self.tri(liste_noms_sd)
+      self.listbox = Pmw.ScrolledListBox(self.frame_haut,
+                        items=liste_noms_sd,
+                labelpos='n',
+                #label_text="Structures de données du type\n requis parl'objet courant :",
+                label_text="Listes du type\n requis parl'objet courant :",
+                listbox_height = 6,
+                dblclickcommand=lambda s=self,c=UNIQUE_ASSD_Panel.valid_valeur : s.choose_valeur_from_list(c))
+      self.listbox.place(relx=0.00,rely=0.00,relwidth=0.4)
+
+      # On eneleve le label pour gagner de la place 
+      #self.label = Label(self.frame_choix,text="Valeur :")
+      #self.label.place(relx=0.05,rely=0.85)
+      self.make_entry(frame = self.frame_choix,command = self.add_valeur_plusieurs_base,x=0.28,y=0.55)
+      
+      # boutons Ajouter et Supprimer
+      bouton_add = Button(self.frame_fleches, image = images.get_image('arrow_left'),
+                          command = self.add_valeur_plusieurs_base)
+      bouton_sup = Button(self.frame_fleches, image = images.get_image('arrow_right'),
+                          command = self.sup_valeur_sans_into)
+      bouton_add.place(relx=0.2,rely=0.25)
+      bouton_sup.place(relx=0.2,rely=0.70)
+
+
+      # boutons Accepter et Annuler dans frame2
+      bouton_accepter = Button(self.frame2, text='Valider',
+                               command = lambda s=self,m=min,M=max : s.accepte_modifs_valeur(m,M))
+      bouton_annuler = Button(self.frame2, text = 'Annuler',
+                              command = self.annule_modifs_valeur)
+      for but in (bouton_accepter,bouton_annuler):
+          but.pack(side='left',padx=5)
+
+      # création des objets dans les frames
+      liste_commandes_valeurs = (("<Button-1>",self.selectValeur),
+                                 ("<Button-3>",self.deselectValeur),
+                                 ("<Double-Button-1>",self.sup_valeur_sans_into))
+      self.Liste_valeurs = ListeChoix(self,self.frame_valeurs,l_valeurs,
+                                      liste_commandes = liste_commandes_valeurs,
+                                      titre="Valeur(s) non-prédéfinies(s)",
+                                      fonte_titre=None
+                                      )
+
+      for fram in (self.frame1,self.frame2,self.frame_bas,self.frame_haut,self.frame_valeurs,
+                 self.frame_fleches,self.frame_choix):
+          fram.bind("<Button-3>",lambda e,s=self,a=bulle_aide: s.parent.appli.affiche_aide(e,a))
+          fram.bind("<ButtonRelease-3>",self.parent.appli.efface_aide)
+
+      self.Liste_valeurs.affiche_liste()
+      if len(l_valeurs) > 0 :
+          liste_marque=l_valeurs[-1]
+          self.Liste_valeurs.surligne(liste_marque)
+      
+  def get_aide(self):
+      """
+      Retourne la phrase d'aide indiquant de quel type de base doivent être les valeurs
+      saisies par l'utilisateur
+      """
+      commentaire="Ce motclef accepte soit un nom de liste déja définie soit une liste manuelle de valeurs"
+      return commentaire
+
+  def get_aide2(self):
+      min,max = self.node.item.GetMinMax()
+      aideval=self.node.item.aide()
+      commentaire="min : " + str(min) + ", max : " + str(max)
+      aideval=commentaire + aideval
+      return aideval
+
+  def choose_valeur_from_list(self,command):
+      """
+      Affecte à valeur choisie la sélection courante dans la liste des choix proposés
+      Exécute command
+      """
+      self.Liste_valeurs.liste=[]
+      self.Liste_valeurs.affiche_liste()
+      if len(self.listbox.get()) == 0 : return
+      choix = self.listbox.getcurselection()[0]
+      d={}
+      d["valeurentree"]=choix
+      apply(command,(self,),d)
+     
+
+
+  def tri(self,liste_noms_sd):
+      a=(3+8j)
+      d_types = { 'TXM' : type('A'),
+                  'R'   : type(3.),
+                  'I'   : type(0),
+                  'C'   : type(a)}
+
+      # On enleve seulement ceux qu'on peut
+      # Sur certaines listes, il est possible qu'on ne 
+      # sache pas déterminer le type
+      listefinale=[]
+      typespossibles=self.node.item.object.definition.type
+      typecherche = None
+      for t in typespossibles:
+          if t in d_types.keys() :
+             typecherche = d_types[t]
+             break
+      for liste in liste_noms_sd:
+          valeur,validite=self.node.item.eval_valeur(liste)
+          for mc in valeur.etape.mc_liste :
+              try :
+                 if type(mc.valeur)  in (types.ListType,types.TupleType) :
+                    typeliste=type(mc.valeur[0])
+                 else :
+                    typeliste=type(mc.valeur)
+                 if type(mc.valeur[0]) == typecherche:
+                    listefinale.append(liste)
+              except:
+                 listefinale.append(liste)
+      return listefinale
+
diff --git a/InterfaceTK/plusieursintopanel.py b/InterfaceTK/plusieursintopanel.py
new file mode 100644 (file)
index 0000000..3484a83
--- /dev/null
@@ -0,0 +1,163 @@
+# -*- 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 Tkinter import *
+import Pmw
+from copy import copy,deepcopy
+import traceback
+
+# Modules Eficas
+from Editeur import Objecttreeitem
+from Aster import prefs
+import panels
+import images
+from widgets import ListeChoix
+from widgets import FenetreDeSelection
+
+from Noyau.N_CR import justify_text
+from Editeur.utils import substract_list
+
+# Import des panels
+from plusieurspanel import PLUSIEURS_Panel
+
+class PLUSIEURS_INTO_Panel(PLUSIEURS_Panel):
+  """
+  Classe servant à définir le panneau permettant d'afficher et de saisir une
+  liste de valeurs à choisir parmi une liste discrètes de valeurs possibles
+  """
+  def makeValeurPage(self,page):
+      """
+      Génère la page de saisie de plusieurs valeurs parmi un ensemble discret
+      de possibles
+      """
+      self.ajout_valeurs = None
+      # On récupère la bulle d'aide du panneau, l'objet, min et max (cardinalité de la liste),
+      # la liste des choix et la liste des valeurs
+      aide = self.get_aide()
+      aide = justify_text(texte=aide)
+      bulle_aide=self.get_bulle_aide()
+      objet_mc = self.node.item.get_definition()
+      min,max = self.node.item.GetMinMax()
+      #l_choix=list(objet_mc.into)
+      l_valeurs = self.node.item.GetListeValeurs()
+      l_choix= self.node.item.get_liste_possible(l_valeurs)
+      # reinitialisation de l_valeurs
+      l_valeurs = self.node.item.GetListeValeurs()
+
+      # remplissage du panneau
+      self.frame_valeurs = Frame(page)
+      self.frame_valeurs.place(relx=0.05,rely=0.05,relwidth=0.35,relheight=0.7)
+      self.frame_boutons_fleches = Frame(page)
+      self.frame_boutons_fleches.place(relx=0.4,rely=0.,relwidth=0.2,relheight=0.7)
+      self.frame_choix = Frame(page)
+      self.frame_choix.place(relx=0.6,rely=0.05,relwidth=0.35,relheight=0.7)
+      self.frame_boutons = Frame(page)
+      self.frame_boutons.place(relx=0.35,rely=0.87,relwidth=1,relheight=0.1)
+      self.frame_aide = Frame(page)
+      self.frame_aide.place(relx=0.1,rely=0.75,relwidth=1,relheight=0.15)
+      liste_commandes_valeurs = (("<Button-1>",self.selectValeur),
+                                 ("<Button-3>",self.deselectValeur),
+                                 ("<Double-Button-1>",self.sup_valeur))
+      liste_commandes_choix = (("<Button-1>",self.selectChoix),
+                               ("<Button-3>",self.deselectChoix),
+                               ("<Double-Button-1>",self.add_choix))
+      self.Liste_valeurs = ListeChoix(self,self.frame_valeurs,
+                                      l_valeurs,liste_commandes = liste_commandes_valeurs,
+                                      titre="Valeur(s) actuelle(s)")
+      self.Liste_choix = ListeChoix(self,self.frame_choix,l_choix,
+                                    liste_commandes = liste_commandes_choix,
+                                    titre= "Valeurs possibles")
+      self.bouton_add = Button(self.frame_boutons_fleches,
+                          #text="<--",
+                          image = images.get_image('arrow_left'),
+                          command = self.add_choix)
+      self.bouton_sup = Button(self.frame_boutons_fleches,
+                          #text="-->",
+                          image = images.get_image('arrow_right'),
+                          command = self.sup_valeur)
+      self.bouton_accepter = Button(self.frame_boutons,
+                               text='Valider',
+                               command = lambda s=self,m=min,M=max : s.accepte_modifs_valeur(m,M))
+      self.bouton_annuler = Button(self.frame_boutons,
+                              text = 'Annuler',
+                              command = self.annule_modifs_valeur)
+      self.bouton_add.place(relx=0.3,rely=0.35)
+      self.bouton_sup.place(relx=0.3,rely=0.65)
+      for but in (self.bouton_accepter,self.bouton_annuler):
+          but.pack(side='left',padx=3)
+      self.Liste_valeurs.affiche_liste()
+      if len(l_valeurs) > 0 :
+          liste_marque=l_valeurs[-1]
+          self.Liste_valeurs.surligne(liste_marque)
+          self.selectValeur(l_valeurs[-1])
+      self.Liste_choix.affiche_liste()
+      for fram in (self.frame_valeurs,self.frame_boutons_fleches,self.frame_choix,self.frame_boutons):
+          fram.bind("<Button-3>",lambda e,s=self,a=bulle_aide : s.parent.appli.affiche_aide(e,a))
+          fram.bind("<ButtonRelease-3>",self.parent.appli.efface_aide)
+      self.frame_aide.update()
+      self.aide = Label(self.frame_aide,
+                        text = aide,
+                        justify='center',
+                        anchor='center')
+                        #wraplength=int(self.frame_aide.winfo_width()*0.8))
+      self.aide.place(relx=0.3,rely=0.5,anchor='center',relwidth=1)
+
+  def get_aide(self):
+      """
+      Retourne la phrase d'aide indiquant de quel type de base doivent être les valeurs
+      que saisit l'utilisateur
+      """
+      commentaire=""
+      mc = self.node.item.get_definition()
+      d_aides = { 'TXM' : 'chaînes de caractères',
+                  'R'   : 'réels',
+                  'I'   : 'entiers',
+                  'C'   : 'complexes'}
+      type = mc.type[0]
+      if not d_aides.has_key(type) : 
+         if mc.min == mc.max:
+            return str(mc.min)+" valeur(s) est(sont) attendue(s)"
+         else :
+            return "entrez entre "+str(mc.min)+" et "+str(mc.max)+" valeurs"
+      if mc.min == mc.max:
+            commentaire="Une liste de "+str(mc.min)+" "+d_aides[type]+" est attendue"
+      else :
+            commentaire="Entre "+str(mc.min)+" et "+str(mc.max)+" valeurs de type  "+d_aides[type]+" sont attendues"
+      aideval=self.node.item.aide()
+      commentaire=commentaire + "\n" + aideval
+      return commentaire
+
+  def get_bulle_aide(self):
+      """
+      Retourne la bulle d'aide du panneau (affichée par clic droit)
+      """
+      return """Un clic sur une valeur des deux listes la sélectionne.
+      - Un clic sur la flèche gauche stocke la valeur possible sélectionnée
+      dans la liste des valeurs que vous voulez affecter au mot-clé simple
+      - Un clic sur la flèche droite déstocke la valeur du mot-clé simple
+      sélectionnée (elle apparaît alors à nouveau comme choix possible
+      dans la liste des choix à droite)
+      - Cliquez sur 'Valider' pour affecter la liste des valeurs sélectionnées
+      au mot-clé simple courant
+      - Cliquez sur 'Annuler' pour restaurer la valeur du mot-clé simple
+      avant toute modification depuis le dernier 'Valider'"""
+
diff --git a/InterfaceTK/plusieurspanel.py b/InterfaceTK/plusieurspanel.py
new file mode 100644 (file)
index 0000000..b79906f
--- /dev/null
@@ -0,0 +1,177 @@
+# -*- 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 Tkinter import *
+import Pmw
+from copy import copy,deepcopy
+import traceback
+
+# Modules Eficas
+from Editeur import Objecttreeitem
+from Aster import prefs
+import panels
+import images
+from widgets import ListeChoix
+from widgets import FenetreDeSelection
+
+from Noyau.N_CR import justify_text
+from Editeur.utils import substract_list
+
+# Import des panels
+from  newsimppanel import newSIMPPanel
+
+
+class PLUSIEURS_Panel(newSIMPPanel):
+  """
+  Classe virtuelle servant de classe mère à toutes celles définissant
+  un panneau pour un mot-clé simple qui attend une liste de valeurs
+  """
+  def accepte_modifs_valeur(self,min,max,liste=None):
+      """
+      Méthode qui récupère la liste des valeurs donnée par l'utilisateur
+      et l'affecte au mot-clé courant.
+      le parametre None n'est pas rempli sauf par l appel a partir de fonctionpanel
+      """
+      if liste==None:
+         l1_valeurs = self.Liste_valeurs.get_liste()
+      else:
+         l1_valeurs = liste
+
+      #nettoyage de la liste
+      l_valeurs=[]
+      for  val in l1_valeurs :
+        if val != '' and val != None :
+           l_valeurs.append(val)
+    
+      longueur = len(l_valeurs)
+      if longueur < min or longueur > max :
+          self.parent.appli.affiche_infos("Valeur refusée : nombre d'éléments incorrect dans la liste")
+          return
+      if longueur > 1:
+         valeur = tuple(l_valeurs)
+      elif longueur == 1:
+         valeur = l_valeurs[0]
+      else:
+         valeur = None
+
+      self.parent.appli.affiche_infos("Valeur acceptée")
+      self.record_valeur(valeur)
+      # fermeture de la fenêtre de sélection
+      if self.ajout_valeurs:
+          self.ajout_valeurs.quit()
+          
+  def annule_modifs_valeur(self):
+      """
+      RAZ de la liste des valeurs (annule toutes les valeurs saisies par l'utilisateur)
+      """
+      self.node.select()
+      # fermeture de la fenêtre de sélection
+      if self.ajout_valeurs:
+          self.ajout_valeurs.quit()
+          
+  def add_valeur_sans_into(self,name=None,encorevalide=1):
+      """
+      Tente d'ajouter la valeur fournie (name) à la liste courante :
+        - si la valeur est acceptable, elle est ajoutée dans la liste des valeurs
+        - sinon elle est refusée
+
+      encorevalide peut prendre les valeurs suivantes :
+
+                   - valeur 1 si le validateur trouve l item et la liste correctes
+                   - valeur 0 si le validateur trouve la valeur de l item incorrecte
+                   - valeur -1 si le validateur trouve la liste incorrecte
+      """
+      valeur = name
+      commentaire="Valeur incorrecte : ajout à la liste refusé"
+      testvalide=1
+
+      # Pas de traitement des valeurs nulles ( a priori clic involontaire
+      if (valeur == None or valeur =="") :
+          commentaire = "Pas de saisie des valeurs nulles"
+          encorevalide = -2 
+          testtype=0
+      else :
+          testtype,comment = self.node.item.object.verif_type(valeur)
+          if not testtype :
+               commentaire =comment
+               encorevalide=-2
+                
+      if (encorevalide ==0) :
+         commentaire=self.node.item.info_erreur_item()
+      if (encorevalide == -1) :
+         commentaire=self.node.item.info_erreur_liste()
+         # On traite le cas ou la liste n est pas valide pour un pb de cardinalite
+         min,max = self.node.item.GetMinMax()
+         if len(self.Liste_valeurs.get_liste()) >= max : 
+            commentaire="La liste a déjà atteint le nombre maximum d'éléments,ajout refusé"
+
+      if testvalide and (encorevalide == 1):
+         min,max = self.node.item.GetMinMax()
+
+         if testtype :
+            liste_valeurs = self.Liste_valeurs.get_liste()
+            if len(liste_valeurs) >= max :
+                commentaire="La liste a déjà atteint le nombre maximum d'éléments,ajout refusé"
+            else :
+               if (self.Liste_valeurs.selection != None):
+                   ligne=self.Liste_valeurs.cherche_selected_item()
+                   liste_valeurs.insert(ligne,valeur)
+               else :
+                   liste_valeurs.append(valeur)
+               try :
+                  self.set_valeur_texte(str(self.entry.get()))
+               except :
+                  pass
+               self.Liste_valeurs.put_liste(liste_valeurs)
+               self.erase_valeur()
+               commentaire="Nouvelle valeur acceptée"
+         else :
+            commentaire ="Type de la valeur incorrecte"
+
+      self.parent.appli.affiche_infos(commentaire)
+
+  def sup_valeur_sans_into(self,name=None):
+      """
+      Méthode qui sert à retirer de la liste des valeurs la valeur sélectionnée
+      """
+      try:
+          self.Liste_valeurs.remove_selected_item()
+          self.display_valeur(self.selected_valeur)
+          self.selected_valeur = None      
+      except:
+          # la valeur sélectionnée n'est pas dans la liste
+          return
+
+  def display_valeur(self,val=None):
+      """
+      Affiche la valeur passée en argument dans l'entry de saisie.
+      Par défaut affiche la valeur du mot-clé simple
+      """
+      if not val :
+          #valeur = self.node.item.getval()
+          valeur = self.node.item.object.getval()
+      else:
+          valeur = val
+      self.entry.delete(0,END)
+      if not valeur : return
+      self.entry.insert(0,str(valeur))
+      
diff --git a/InterfaceTK/prefsTK.py b/InterfaceTK/prefsTK.py
new file mode 100644 (file)
index 0000000..6590c55
--- /dev/null
@@ -0,0 +1,66 @@
+# -*- 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.
+#
+#
+# ======================================================================
+
+
+labels= ('Fichier','Edition','Jeu de commandes',
+                'Options',
+                'Aide',
+                 'Traduction',
+           )
+
+appli_composants=['readercata','bureau',
+                   'options',
+           ]
+
+menu_defs={ 'bureau': [
+              ('Fichier',[
+                           ('Nouveau','newJDC','<Control-n>','Ctrl+N'),
+                           ('Nouvel INCLUDE','newJDC_include'),
+                           ('Ouvrir','openJDC','<Control-o>','Ctrl+O'),
+                           ('Enregistrer','saveJDC','<Control-s>','Ctrl+S'),
+                           ('Enregistrer sous','saveasJDC','<Control-e>','Ctrl+E'),
+                           None,
+                           ('Fermer','closeJDC','<Control-w>','Ctrl+W'),
+                           ('Quitter','exitEFICAS','<Control-q>','Ctrl+Q'),
+                         ]
+              ),
+              ('Edition',[
+                           ('Copier','copy','<Control-c>','Ctrl+C'),
+                           ('Couper','cut','<Control-x>','Ctrl+X'),
+                           ('Coller','paste','<Control-v>','Ctrl+V'),
+                         ]
+              ),
+              ('Jeu de commandes',[
+               ('Rapport de validation','visuCRJDC','<Control-r>','Ctrl+R'),
+               ('Fichier source','visu_txt_brut_JDC','<Control-b>','Ctrl+B'),
+               #('Paramètres Eficas','affichage_fichier_ini'),
+                                  ]
+              ),
+              ('Traduction',[
+               ('Traduction v7 en v8','TraduitFichier','<Control-t>','Ctrl+T'),
+                            ]
+              ),
+              ('Aide',[
+                        ('Aide EFICAS','aideEFICAS','<Control-a>','Ctrl+A'),
+                      ]
+              ),
+             ]
+           }
diff --git a/InterfaceTK/readercata.py b/InterfaceTK/readercata.py
new file mode 100644 (file)
index 0000000..07c5ebf
--- /dev/null
@@ -0,0 +1,444 @@
+# -*- 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 sert à lire un catalogue et à construire
+    un objet CataItem pour Eficas.
+    Il s'appuie sur la classe READERCATA
+"""
+# Modules Python
+import time
+import os,sys,py_compile
+import traceback
+import cPickle
+import Pmw
+import re
+
+# Modules Eficas
+from Editeur import analyse_catalogue
+from Editeur import autre_analyse_cata
+from Editeur import uiinfo
+from Noyau.N_CR import CR
+from InterfaceTK.widgets import showinfo,showerror
+from InterfaceTK.widgets import Fenetre
+from InterfaceTK import fontes
+
+from utils import init_rep_cata_dev
+
+
+class READERCATA:
+
+   menu_defs=[
+              ('Catalogue',[
+                           ("Rapport de validation catalogue",'visuCRCATA'),
+                         ]
+              )
+             ]
+
+   button_defs=[]
+
+   def __init__(self,appli,parent):
+      self.appli=appli
+      self.parent=parent
+      self.code=self.appli.code
+      self.appli.format_fichier.set('python')
+      self.version_code=self.appli.version_code
+      self.fic_cata=None
+      self.version_cata=None
+      self.OpenCata()
+      self.cataitem=None
+
+   def OpenCata(self):
+      """ 
+          Ouvre le catalogue standard du code courant, cad le catalogue présent
+          dans le répertoire Cata 
+      """
+      if self.appli.ihm == "TK" :
+         from InterfaceTK import splash
+      message1 = "Compilation des fichiers Eficas \n\n Veuillez patienter ..."
+      if self.appli.test == 0 and self.appli.ihm=="TK" :
+         splash._splash.configure(text = message1)
+      self.configure_barre(4)
+
+      liste_cata_possibles=[]
+      for catalogue in self.appli.CONFIGURATION.catalogues:
+          if catalogue[0] == self.code :
+             liste_cata_possibles.append(catalogue)
+
+      if len(liste_cata_possibles)==0:
+          showerror("Import du catalogue","Pas de catalogue defini pour le code %s" % self.code)
+          self.appli.quit()
+          sys.exit(1)
+
+      if self.version_code is not None:
+          # La version a ete fixee
+          for cata in liste_cata_possibles:
+             if self.version_code == cata[1]:
+                self.fic_cata = cata[2]
+                self.appli.format_fichier.set(cata[3])
+      elif len(liste_cata_possibles)==1:
+          self.fic_cata = liste_cata_possibles[0][2]
+          self.code = self.appli.CONFIGURATION.catalogues[0][0]
+          self.version_code = liste_cata_possibles[0][1]
+          self.appli.format_fichier.set(liste_cata_possibles[0][3])
+      else:
+          # plusieurs catalogues sont disponibles : il faut demander à l'utilisateur
+          # lequel il veut utiliser ...
+          self.ask_choix_catalogue()
+
+      if self.fic_cata == None :
+          print "Pas de catalogue pour code %s, version %s" %(self.code,self.version_code)
+          sys.exit(0)
+
+      # Determinination du repertoire materiau
+      v_codeSansPoint=self.version_code
+      v_codeSansPoint=re.sub("\.","",v_codeSansPoint)
+      chaine="rep_mat_"+v_codeSansPoint
+      if hasattr(self.appli.CONFIGURATION,chaine):
+          a=getattr(self.appli.CONFIGURATION,chaine)
+      else :
+          try :
+             a=self.appli.CONFIGURATION.dRepMat[self.version_code]
+          except :
+             print "Probleme avec le repertoire materiau"
+             a='.'
+      self.appli.CONFIGURATION.rep_mat=a 
+
+      # détermination de fic_cata_c et fic_cata_p
+      self.fic_cata_c = self.fic_cata + 'c'
+      self.fic_cata_p = os.path.splitext(self.fic_cata)[0]+'_pickled.py'
+
+      # import du catalogue
+      if self.appli.test == 0 and self.appli.ihm=="TK" :
+         splash._splash.configure(text = "Debut import_cata: %d s" % time.clock())
+      self.cata = self.import_cata(self.fic_cata)
+      self.update_barre()
+      if self.appli.test == 0 and self.appli.ihm=="TK" :
+         splash._splash.configure(text = "Fin import_cata: %d s" % time.clock())
+      if not self.cata : 
+          showerror("Import du catalogue","Impossible d'importer le catalogue %s" %self.fic_cata)
+          self.appli.quit()
+          sys.exit(1)
+      #
+      # analyse du catalogue (ordre des mots-clés)
+      #
+      if self.appli.test == 0 and self.appli.ihm=="TK" :
+         splash._splash.configure(text = "Debut Retrouve_Ordre: %d s" % time.clock())
+      # Retrouve_Ordre_Cata_Standard fait une analyse textuelle du catalogue
+      # remplacé par Retrouve_Ordre_Cata_Standard_autre qui utilise une numerotation
+      # des mots clés à la création
+      #self.Retrouve_Ordre_Cata_Standard()
+      self.Retrouve_Ordre_Cata_Standard_autre()
+      self.update_barre()
+      if self.appli.test == 0 and self.appli.ihm=="TK" :
+         splash._splash.configure(text = "Fin Retrouve_Ordre: %d s" % time.clock())
+      #
+      # analyse des données liées à l'IHM : UIinfo
+      #
+      uiinfo.traite_UIinfo(self.cata)
+      self.update_barre()
+
+      #
+      # traitement des clefs documentaires
+      #
+      self.traite_clefs_documentaires()
+
+      # chargement et analyse des catalogues développeur (le cas échéant)
+      #
+      if self.appli.CONFIGURATION.isdeveloppeur == 'OUI' :
+          init_rep_cata_dev(self.fic_cata,self.appli.CONFIGURATION.path_cata_dev)
+          fic_cata_dev = os.path.join(self.appli.CONFIGURATION.path_cata_dev,'cata_developpeur.py')
+          if os.path.isfile(fic_cata_dev):
+              # il y a bien un catalogue développeur : il faut récupérer le module_object associé ...
+              test = self.compile_cata(fic_cata_dev,fic_cata_dev+'c')
+              if not test :
+                  showinfo("Compilation catalogue développeur",
+                           "Erreur dans la compilation du catalogue développeur")
+                  self.cata = (self.cata,)
+              else:
+                  self.cata_dev =self.import_cata(fic_cata_dev)
+                  #self.Retrouve_Ordre_Cata_Developpeur()
+                  self.Retrouve_Ordre_Cata_Developpeur_autre()
+                  self.cata = (self.cata,self.cata_dev)
+          else:
+              self.cata = (self.cata,)
+      else:
+          self.cata = (self.cata,)
+      titreSuite=" avec le catalogue " + os.path.basename(self.fic_cata)
+      titre=self.appli.titre+titreSuite
+      if self.appli.top:
+        self.appli.top.title(titre)
+      self.appli.titre=titre
+
+       
+   def import_cata(self,cata):
+      """ 
+          Réalise l'import du catalogue dont le chemin d'accès est donné par cata
+      """
+      if self.appli.test == 0 and self.appli.ihm=="TK"  :
+         from InterfaceTK import splash
+         splash._splash.configure(text = "Chargement du catalogue")
+      nom_cata = os.path.splitext(os.path.basename(cata))[0]
+      rep_cata = os.path.dirname(cata)
+      sys.path[:0] = [rep_cata]
+      try :
+          o=__import__(nom_cata)
+          return o
+      except Exception,e:
+          traceback.print_exc()
+          return 0
+
+   def Retrouve_Ordre_Cata_Standard_autre(self):
+      """ 
+          Construit une structure de données dans le catalogue qui permet
+          à EFICAS de retrouver l'ordre des mots-clés dans le texte du catalogue.
+          Pour chaque entité du catlogue on crée une liste de nom ordre_mc qui
+          contient le nom des mots clés dans le bon ordre
+      """ 
+      self.cata_ordonne_dico,self.appli.liste_simp_reel=autre_analyse_cata.analyse_catalogue(self.cata)
+
+   def Retrouve_Ordre_Cata_Standard(self):
+      """ 
+          Retrouve l'ordre des mots-clés dans le catalogue, cad :
+           - si ce dernier a été modifié, relance l'analyse du catalogue pour déterminer
+               l'ordre des mots-clés dans le catalogue
+           - s'il n'a pas été modifié, relie le fichier pickle 
+      """
+      time1 = os.path.getmtime(self.fic_cata)
+      try :
+          time2 = os.path.getmtime(self.fic_cata_p)
+      except:
+          time2 = 0
+      if time2 > time1 :
+          # l'objet catalogue n'a pas été modifié depuis le dernier "pickle"
+          self.Get_Ordre_Cata()
+      else :
+          # le catalogue a été modifié depuis le dernier "pickle" :
+          # il faut retrouver l'ordre du catalogue et refaire pickle
+          self.Get_Ordre_Cata(mode='cata')
+      self.appli.affiche_infos("Catalogue standard chargé")
+
+   def Retrouve_Ordre_Cata_Developpeur(self):
+      """ 
+          Retrouve l'ordre des mots-clés dans le catalogue, cad :
+          - si ce dernier a été modifié, relance l'analyse du catalogue pour déterminer
+            l'ordre des mots-clés dans le catalogue
+          - s'il n'a pas été modifié, relie le fichier pickle 
+      """
+      if self.code != 'ASTER' : return
+      fic_cata = os.path.join(self.appli.CONFIGURATION.path_cata_dev,'cata_developpeur.py')
+      message="Chargement catalogue développeur présent dans :\n %s..." % self.appli.CONFIGURATION.path_cata_dev
+      if self.appli.test == 0 and self.appli.ihm=="TK" :
+         splash._splash.configure(text = message,barre='oui')
+      cata_dev_ordonne = analyse_cata.analyse_catalogue(self,self.fic_cata)
+      self.cata_dev_ordonne_cr = cata_dev_ordonne.cr
+      cata_dev_ordonne_dico = cata_dev_ordonne.entites
+      self.cata_ordonne_dico.update(cata_dev_ordonne_dico)
+      self.appli.affiche_infos(" catalogue(s) développeur(s) chargé(s)" )
+
+   def Retrouve_Ordre_Cata_Developpeur_autre(self):
+      """
+          Retrouve l'ordre des mots-clés dans le catalogue, cad :
+          - si ce dernier a été modifié, relance l'analyse du catalogue pour déterminer
+            l'ordre des mots-clés dans le catalogue
+          - s'il n'a pas été modifié, relie le fichier pickle
+      """
+      if self.code != 'ASTER' : return
+      message="Chargement catalogue développeur présent dans :\n %s..." % self.appli.CONFIGURATION.path_cata_dev
+      if self.appli.test == 0  and self.appli.ihm=="TK":
+         splash._splash.configure(text = message,barre='oui')
+      cata_dev_ordonne_dico,self.appli.liste_simp_reel=autre_analyse_cata.analyse_catalogue(self.cata)
+      self.cata_ordonne_dico.update(cata_dev_ordonne_dico)
+      self.appli.affiche_infos(" catalogue(s) développeur(s) chargé(s)" )
+
+   def Get_Ordre_Cata(self,mode='pickle'):
+      """ 
+          Retrouve l'ordre du catalogue :
+            - mode='pickle ': tente de relire le fichier pickle et sinon lance l'analyse du catalogue
+            - mode='cata'   : force l'analyse du catalogue directement sans relire le pickle
+      """
+      if mode == 'pickle' :
+          try:
+              f = open(self.fic_cata_p)
+              u = cPickle.Unpickler(f)
+              if self.appli.test == 0 and self.appli.ihm=="TK" :
+                 splash._splash.configure(text = "Analyse du catalogue")
+              self.cata_ordonne_dico = u.load()
+              f.close()
+          except :
+              # on peut ne pas arriver à relire le fichier pickle s'il a été altéré
+              # ou (le plus probable) s'il a été créé sous un autre OS
+              self.Get_Ordre_Cata(mode='cata')
+      elif mode == 'cata':
+          if self.appli.test == 0 and self.appli.ihm=="TK" :
+              splash._splash.configure(text = "Analyse du catalogue",barre='oui')
+          cata_ordonne = analyse_catalogue.analyse_catalogue(self,self.fic_cata)
+          self.cata_ordonne_cr = cata_ordonne.cr
+          self.cata_ordonne_dico = cata_ordonne.entites
+          splash._splash.configure(text = "Sauvegarde des informations sur le catalogue")
+          f = open(self.fic_cata_p,'w+')
+          p = cPickle.Pickler(f)
+          p.dump(self.cata_ordonne_dico)
+          f.close()
+      else :
+          raise Exception("Appel à un mode inconnu de Get_Ordre_Cata : %s" % mode)
+          return
+
+   def ask_choix_catalogue(self):
+      """
+      Ouvre une fenêtre de sélection du catalogue dans le cas où plusieurs
+      ont été définis dans Accas/editeur.ini
+      """
+      # construction du dictionnaire et de la liste des catalogues
+      self.dico_catalogues = {}
+      defaut = None
+      for catalogue in self.appli.CONFIGURATION.catalogues:
+          if catalogue[0] == self.code :
+              self.dico_catalogues[catalogue[1]] = catalogue
+              if len(catalogue) == 5 :
+                  if catalogue[4]=='defaut' : defaut = catalogue[1]
+      liste_choix = self.dico_catalogues.keys()
+      liste_choix.sort()
+      # test si plusieurs catalogues ou non
+      if len(liste_choix) == 0:
+          showerror("Aucun catalogue déclaré pour %s" %self.code)
+          self.appli.quit()
+          sys.exit(1)
+      elif len(liste_choix) == 1:
+          self.fic_cata = self.dico_catalogues[liste_choix[0]][2]
+          self.version_code = liste_choix[0]
+          return
+      # création d'une boîte de dialogue modale
+      from InterfaceTK import splash
+      self.fenetre_choix_cata = Pmw.Dialog(splash._splash, #avec self.parent, ne marche pas sous Windows
+                                           buttons=('OK','ANNULER'),
+                                           defaultbutton = 'OK',
+                                           title = "Choix d'une version du code %s" %self.code,
+                                           command = self.chooseCata)
+      # construction des radioboutons
+      label = `len(liste_choix)`+' versions du code %s sont disponibles\n' %self.code
+      label = label + 'Veuillez choisir celle avec laquelle vous souhaitez travailler :'
+      self.radiobutton = Pmw.RadioSelect(self.fenetre_choix_cata.interior(),
+                                         buttontype='radiobutton',
+                                         labelpos = 'w',
+                                         label_text = label,
+                                         label_font =  fontes.standard,
+                                         orient='vertical')
+      for choix in liste_choix :
+          self.radiobutton.add(choix)
+      if defaut == None :
+          # aucun catalogue par défaut n'a été spécifié dans Accas/editeur.ini
+          defaut = liste_choix[0]
+      self.radiobutton.invoke(defaut)
+      self.radiobutton.pack(fill='x',padx=10,pady=10)
+      # centrage de la fenêtre
+      self.fenetre_choix_cata.activate(geometry='centerscreenalways')
+
+   def chooseCata(self,txt):
+      """ 
+          Méthode activée lorsque l'utilisateur a fait son choix et cliqué sur 'OK' ou sur 'ANNULER'
+      """
+      if txt == 'OK' :
+          version_cata = self.radiobutton.getcurselection()
+          self.fic_cata = self.dico_catalogues[version_cata][2]
+          self.version_code = version_cata
+          self.appli.format_fichier.set(self.dico_catalogues[version_cata][3])
+          self.fenetre_choix_cata.destroy()
+      else:
+          self.parent.destroy()
+
+   def compile_cata(self,cata,catac):
+      """ 
+           Teste si le catalogue a bien besoin d'être recompilé et si oui, le compile et
+           affiche un message dans le splash . Retourne 1 si la compilation s'est bien déroulée,
+           0 sinon.
+      """
+      time1 = os.path.getmtime(cata)
+      try:
+          time2 = os.path.getmtime(catac)
+      except:
+          time2 = 0
+      if time1 > time2:
+          try:
+              # le catalogue doit être recompilé avant d'être importé
+              if self.appli.test == 0 and self.appli.ihm=="TK" :
+                 splash._splash.configure(text="Compilation du catalogue\nCela peut prendre plusieurs secondes ...")
+              py_compile.compile(cata)
+          except:
+              return 0
+      return 1
+
+
+#--------------------------------------------------------------------------------
+# Méthodes concernant la barre de progression lors de l'analyse du catalogue
+#--------------------------------------------------------------------------------
+
+   def configure_barre(self,nbcommandes):
+      """ Configure la barre de progression en lui passant comme paramètre le
+          nombre de commandes du catalogue qui lui sert à déterminer la longueur de son incrément """
+      try:
+          if self.appli.test == 0 and self.appli.ihm=="TK" :
+             splash._splash.configure(barre='oui',ratio = nbcommandes)
+      except:
+          pass
+
+   def update_barre(self):
+      """ Update la position de la barre de progression : la fait progresser de son incrément """
+      try:
+          if self.appli.test == 0 and self.appli.ihm=="TK" :
+             splash._splash.update_barre()
+      except:
+          pass
+
+   def visuCRCATA(self):
+      """
+      Méthode permettant l'affichage du rapport de validation
+      """
+      cr = CR( debut = "Début rapport de validation du catalogue",
+               fin = "Fin rapport de validation du catalogue")
+      titre="rapport de validation du catalogue"
+      if hasattr(self,'cata_ordonne_cr') :
+          cr.add(self.cata_ordonne_cr)
+      if hasattr(self,'cata_dev_ordonne_cr') :
+          cr.add(self.cata_dev_ordonne_cr)
+      for cata in self.cata:
+          if hasattr(cata,'JdC'):
+              cr.add(cata.JdC.report())
+      texte_cr = str(cr)
+      self.visu_texte_cr = Fenetre(self.appli,titre=titre,texte=texte_cr)
+
+
+   def traite_clefs_documentaires(self):
+      try:
+        self.fic_cata_clef=os.path.splitext(self.fic_cata_c)[0]+'_clefs_docu'
+        f=open(self.fic_cata_clef)
+      except:
+        #print "Pas de fichier associé contenant des clefs documentaires"
+        return
+
+      dict_clef_docu={}
+      for l in f.readlines():
+          clef=l.split(':')[0]
+          docu=l.split(':')[1]
+          docu=docu[0:-1]
+          dict_clef_docu[clef]=docu
+      for oper in self.cata.JdC.commandes:
+           if dict_clef_docu.has_key(oper.nom):
+              oper.docu=dict_clef_docu[oper.nom]
diff --git a/InterfaceTK/shellpanel.py b/InterfaceTK/shellpanel.py
new file mode 100644 (file)
index 0000000..b768219
--- /dev/null
@@ -0,0 +1,96 @@
+# -*- 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 Tkinter import *
+import Pmw
+from copy import copy,deepcopy
+import traceback
+
+# Modules Eficas
+from Editeur import Objecttreeitem
+#import prefs
+#import panels
+#import images
+#from widgets import ListeChoix
+#from widgets import FenetreDeSelection
+
+from Noyau.N_CR import justify_text
+from Editeur.utils import substract_list
+from newsimppanel import newSIMPPanel
+
+
+class SHELLPanel(newSIMPPanel):
+  """
+  Classe Panel utilisé pour les mots-clés simples qui attendent un shell pour valeur
+  """
+
+  def makeValeurPage(self,page):
+      """ 
+      Affiche la page concernant l'objet pointé par self qui attend un shell
+      """
+      objet_mc = self.node.item.get_definition()
+      aide = self.gen_aide()
+      aide = justify_text(texte=aide)
+      self.frame = Frame(page)
+      self.frame.place(relx=0,rely=0,relwidth=1,relheight=1)
+      label_aide = Label(self.frame,text = aide)
+      label_aide.place(relx=0.5,rely=0.1,anchor='center')
+      self.text = Text(self.frame,bg='gray95')
+      self.text.place(relx=0.2,rely=0.2,relwidth=0.6,relheight=0.6)
+      but_val = Button(self.frame,text='Valider',command = self.valide_shell)
+      but_ann = Button(self.frame,text='Annuler',command = self.annule_shell)
+      but_val.place(relx=0.35,rely=0.9,anchor='center')
+      but_ann.place(relx=0.65,rely=0.9,anchor='center')
+      self.display_valeur()
+
+  def gen_aide(self):
+      """
+      Retourne une chaîne de caractères d'aide sur la valeur qu'attend l'objet
+      pointé par self
+      """
+      return "Un shell est attendu"
+    
+  def valide_shell(self,event=None):
+      """
+      Récupère la valeur saisie par l'utilisateur dans self.text
+      et la stocke dans l'objet MCSIMP courant
+      """
+      texte = self.text.get(1.0,END)
+      self.record_valeur(texte)
+
+  def annule_shell(self,event=None):
+      """
+      Annule toute saisie dans self.text
+      """
+      self.text.delete(0,END)
+
+  def display_valeur(self,val=None):
+      """
+      Affiche la valeur de l'objet pointé par self
+      """
+      if val != None :
+          valeur = val
+      else:
+          valeur = self.node.item.get_valeur()
+      if valeur == None  or valeur == '': return
+      self.text.insert(END,valeur)
+
diff --git a/InterfaceTK/splash.py b/InterfaceTK/splash.py
new file mode 100644 (file)
index 0000000..f1deca6
--- /dev/null
@@ -0,0 +1,150 @@
+# -*- 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 créer, mettre à jour et détruire
+    un écran Splash
+"""
+from Tkinter import *
+
+from centerwindow import centerwindow
+from Tools.foztools.foztools import Slider
+from InterfaceTK import fontes
+import images
+
+_splash=None
+
+def init_splash(*pos,**args):
+   global _splash
+   _splash=SplashScreen(*pos,**args)
+
+def fini_splash():
+   global _splash
+   _splash.quit()
+   _splash=None
+
+class SplashScreen(Toplevel):
+    """ 
+        Provides a splash screen. Usage:
+        Subclass and override 'CreateWidgets()'
+        In constructor of main window/application call
+           - S = SplashScreen(main=self)        (if caller is Toplevel)
+           - S = SplashScreen(main=self.master) (if caller is Frame)
+           - S.quit()  after you are done creating your widgets etc.
+    """
+    def __init__(self, master=None,**args):
+        Toplevel.__init__(self, master, relief='groove',
+                          borderwidth=5)
+        self.main = master
+        if self.main != None :
+            self.main.iconify()
+        self.withdraw()
+        self.frame = Frame(self)
+        self.frame.pack(expand=1,fill='both')
+        self.init(args)
+        self.geometry("300x200")
+        self.resizable(0,0)
+        centerwindow(self)
+        self.CreateWidgets()
+        self.deiconify()
+
+    def init(self,args={}):
+        self.text = StringVar()
+        self.text.set('')
+        self.text2 = StringVar()
+        self.text2.set('')
+        self.icone = 'logo_edf.gif'
+        self.barre = 'non'
+        if args == {} : return
+        if args.has_key('text'):
+            self.text.set(args['text'])
+        if args.has_key('info'):
+            self.text2.set(args['info'])
+        if args.has_key('titre'):
+            self.title(args['titre'])
+        if args.has_key('code'):
+            self.code = args['code']
+        else:
+            self.code = 'inconnu'
+        if args.has_key('icone'):
+            self.icone = args['icone']
+        if self.code == 'ASTER' :
+            self.icone = 'code_aster.gif'
+        elif self.code == 'SATURNE':
+            self.icone = 'code_saturne.gif'
+        elif self.code == 'DESCARTES':
+            self.icone = 'code_descartes.gif'
+
+    def CreateWidgets(self):
+        self.catIcon = images.get_image(self.icone)
+        self.label = Label(self.frame, image=self.catIcon)
+        self.label.pack(side=TOP)
+        self.label = Label(self.frame, textvariable=self.text,font = fontes.standard_gras)
+        self.label.pack(side=TOP,expand=1,fill='both')
+        self.label2 = Label(self.frame, textvariable=self.text2,font = fontes.standard_italique)
+        self.label2.pack(side=TOP,expand=1,fill='both')
+        self.progress = Slider(self.frame,value=0,max=100,orientation='horizontal',
+                               fillColor='#00008b',width=200,height=30,
+                               background='white',labelColor='red')
+        centerwindow(self)
+
+    def update_barre(self,event=None):
+        """ Permet de faire avancer la barre de progression """
+        try:
+            self.progress.value = self.progress.value+self.increment
+            self.progress.update()
+        except:
+            pass
+
+    def configure_barre(self):
+        """ 
+             Calcule l'incrément de progression de la barre en fonction
+             du nombre d'opérations à effectuer afin que le compteur
+             soit à 100% à la fin des opérations
+        """
+        self.increment = 100./self.ratio
+        self.progress.update()
+
+    def configure(self,**args):
+        if args.has_key('text'):
+            self.text.set(args['text'])
+        if args.has_key('info'):
+            self.text2.set(args['info'])
+        if args.has_key('titre'):
+            self.title(args['titre'])
+        if args.has_key('barre'):
+            old = self.barre
+            self.barre = args['barre']
+            if self.barre == 'oui' and old == 'non':
+                self.progress.frame.pack(in_=self.frame,side='top')
+            elif self.barre == 'non' and old == 'oui':
+                self.progress.frame.pack_forget()
+        if args.has_key('ratio'):
+            self.ratio = args['ratio']
+            self.configure_barre()
+        self.update()
+
+    def quit(self):
+        self.progress = None
+        self.destroy()
+        if self.main:
+           centerwindow(self.main,parent='sans')
+           self.main.deiconify()
+
diff --git a/InterfaceTK/statusbar.py b/InterfaceTK/statusbar.py
new file mode 100644 (file)
index 0000000..e3b809b
--- /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
+import Tkinter
+import types
+
+class STATUSBAR:
+   def __init__(self,parent,police):
+      self.parent=parent
+      self.police=police
+      self.frame = Tkinter.Frame(parent,bd=1, relief=Tkinter.RAISED)
+      self.frame.pack(side=Tkinter.BOTTOM, fill=Tkinter.X)
+      self.label = Tkinter.Label (self.frame,
+                                        fg='black',
+                                        text='',
+                                        justify='left',
+                                        relief='sunken',
+                                        height=3,
+                                        bg='gray95')
+      self.label.pack(side='left',expand=1,fill='both')
+
+   def affiche_infos(self,texte):
+      if len(texte)>150 :
+          texte_infos=texte[0:150]
+      else :
+          texte_infos=texte
+      self.label.configure(text=texte_infos,font=self.police)
+
+   def reset_affichage_infos(self):
+      """ Efface tout message présent dans le panneau en bas d'EFICAS """
+      self.affiche_infos('')
+
diff --git a/InterfaceTK/styles.py b/InterfaceTK/styles.py
new file mode 100644 (file)
index 0000000..ead56a5
--- /dev/null
@@ -0,0 +1,21 @@
+# -*- coding: utf-8 -*-
+import os
+from Aster import prefs
+import basestyle
+from basestyle import STYLE,style
+
+inistylefile=os.path.join(prefs.REPINI,"style.py")
+if os.path.isfile(inistylefile):
+   execfile(inistylefile)
+
+userstylefile=os.path.expanduser("~/Eficas_install/style.py")
+if os.path.isfile(userstylefile):
+   execfile(userstylefile)
+
+from InterfaceTK import fontes
+for attr in dir(style):
+   if attr[0]=='_':continue
+   if not hasattr(fontes,attr):continue
+   setattr(fontes,attr,getattr(style,attr))
+
+
diff --git a/InterfaceTK/toolbar.py b/InterfaceTK/toolbar.py
new file mode 100644 (file)
index 0000000..74248a0
--- /dev/null
@@ -0,0 +1,145 @@
+# -*- 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
+from Tkinter import *
+import Pmw
+
+# Modules Eficas
+import images
+
+class TOOLBAR:
+  def __init__(self,appli,parent):
+      # parent représente l'objet graphique parent
+      self.parent=parent
+      # appli représente l'objet application parent
+      self.appli=appli
+      self.balloon = None
+      self.l_boutons_a_activer = []
+      self.barreboutons=Frame(self.parent,relief='ridge',bd=2)
+      self.barreboutons.pack(anchor='nw',expand=0,fill=X)
+      # bouton Infos à l'extrême droite de la barre des boutons
+      b = Button(self.barreboutons,
+                 image = images.get_image('About24'),
+                 command = self.view_infos)
+      b.pack(side='right')
+      texte = "Infos EFICAS"
+      b.bind("<Enter>",lambda e,s=self,but=b,t=texte : s.affiche_balloon(e,but,t,pos='right'))
+      b.bind("<Leave>", self.efface_balloon)
+
+  def appelle_commande(self,e,b,c):
+      try :
+         c()
+      except :
+         pass
+
+  def inactive_boutons(self):
+      """
+      Inactive les boutons de la liste self.l_boutons_a_activer
+      --> cette méthode est appelée dès qu'il n'y a pas de JDC courant
+      """
+      for but in self.l_boutons_a_activer:
+          but.configure(state='disabled')
+
+  def active_boutons(self):
+      """
+      Active les boutons de la liste self.l_boutons_a_activer
+      --> cette méthode est appelée dès qu'il y a un JDC courant
+      """
+      for but in self.l_boutons_a_activer:
+          but.configure(state='normal')
+
+  def affiche_balloon(self,event,bouton,bulle,pos='left'):
+      """
+      Affiche le balloon bulle associé au bouton bouton
+      """
+      etat = bouton.cget('state')
+      if etat != 'normal' : return
+      geom = bouton.winfo_geometry()
+      l_args = string.split(geom,'+')
+      x = eval(l_args[1])+event.x+10
+      self.balloon = Label(self.parent,
+                           text = bulle,
+                           background="yellow",
+                           borderwidth=2,
+                           relief='ridge')
+      if pos == 'left':
+          self.balloon.place(in_=self.parent,x=x,y=32)
+      else:
+          self.balloon.place(in_=self.parent,x=x,y=32,anchor='ne')
+
+  def efface_balloon(self,event=None):
+      """
+      Efface le balloon courant
+      """
+      if self.balloon :
+          self.balloon.destroy()
+          self.balloon = None
+
+  def view_infos(self):
+      """
+      Permet d'afficher des infos sur la session courante d'EFICAS
+      """
+      self.fen_infos = Pmw.Dialog(self.parent,
+                                  title = 'Informations session EFICAS',
+                                  buttons = ('Fermer',),
+                                  command = self.close_infos)
+      self.fen_infos.withdraw()
+      texte_infos = self.appli.get_texte_infos()
+      Label(self.fen_infos.interior(),
+            text = texte_infos,
+            anchor='center').pack(side='top',anchor='center')
+      self.fen_infos.activate(geometry = 'centerscreenalways')
+
+  def close_infos(self,lbl):
+      """
+      Ferme la fenêtre des infos
+      """
+      self.fen_infos.destroy()
+
+  def creer_boutons_appli_composant(self,l_boutons,appli_composant):
+      for bouton in l_boutons :
+          if not bouton :
+              # on veut afficher un bouton vide (=espace entre boutons)
+              Button(self.barreboutons,
+                     image = images.get_image('Sep'),
+                     state='disabled',
+                     relief = 'flat').pack(side='left')
+              continue
+          nom_fic,commande,texte,statut = bouton
+          commande=getattr(appli_composant,commande)
+          b = Button(self.barreboutons,
+                     image = images.get_image(nom_fic),
+                     command = commande,
+                     relief='flat')
+          b.pack(side='left')
+          b.bind("<Enter>",lambda e,s=self,but=b,t=texte : s.affiche_balloon(e,but,t))
+          b.bind("<Leave>", self.efface_balloon)
+          b.bind("<Return>", lambda e,s=self,but=b,c=commande:s.appelle_commande(e,but,c))
+          if statut != 'always':
+              self.l_boutons_a_activer.append(b)
+
+      # inactive les boutons qui doivent l'être tant qu'aucun JDC courant
+      self.inactive_boutons()
+
+
diff --git a/InterfaceTK/tooltip.py b/InterfaceTK/tooltip.py
new file mode 100644 (file)
index 0000000..18fbabb
--- /dev/null
@@ -0,0 +1,127 @@
+# -*- 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 propose la classe TOOLTIP pour
+    mettre en oeuvre les bulles d'aide
+"""
+
+import Tkinter
+import types
+
+def destruct(obj):
+    # assist in breaking circular references
+    if obj is not None:
+        assert type(obj) is types.InstanceType
+        for k in obj.__dict__.keys():
+            obj.__dict__[k] = None
+            ##del obj.__dict__[k]
+
+def after(widget, ms, func, *args):
+    timer = apply(widget.after, (ms, func) + args)
+    command = widget._tclCommands[-1]
+    return (timer, command, widget)
+
+def after_cancel(t):
+    if t is not None:
+        t[2].after_cancel(t[0])
+        try:
+            t[2].deletecommand(t[1])
+        except Tkinter.TclError:
+            pass
+
+class TOOLTIP:
+    def __init__(self,widget,text=None):
+        self.widget=widget
+        self.text = text
+        self.timer = None
+        self.tooltip = None
+        self.label = None
+        self.bindings = []
+        self.bindings.append(self.widget.bind("<Enter>", self._enter))
+        self.bindings.append(self.widget.bind("<Leave>", self._leave))
+        self.bindings.append(self.widget.bind("<ButtonPress>", self._leave))
+        # user overrideable settings
+        self.time = 1000                    # milliseconds
+        self.relief = Tkinter.SOLID
+        self.justify = Tkinter.LEFT
+        self.fg = "#000000"
+        self.bg = "#ffffe0"
+        self.xoffset = 20
+        self.yoffset = 1
+
+    def setText(self, text):
+        self.text = text
+
+    def _unbind(self):
+        if self.bindings and self.widget:
+            self.widget.unbind("<Enter>", self.bindings[0])
+            self.widget.unbind("<Leave>", self.bindings[1])
+            self.widget.unbind("<ButtonPress>", self.bindings[2])
+            self.bindings = []
+
+    def destroy(self):
+        self._unbind()
+        self._leave()
+
+    def _enter(self, *event):
+        after_cancel(self.timer)
+        self.timer = after(self.widget, self.time, self._showTip)
+
+    def _leave(self, *event):
+        after_cancel(self.timer)
+        self.timer = None
+        if self.tooltip:
+            self.label.destroy()
+            destruct(self.label)
+            self.label = None
+            self.tooltip.destroy()
+            destruct(self.tooltip)
+            self.tooltip = None
+
+    def _showTip(self):
+        if self.tooltip or not self.text:
+            return
+        c = self.widget.__class__
+        if c in (Tkinter.Button,):
+            if self.widget["state"] == Tkinter.DISABLED:
+                return
+        x = self.widget.winfo_rootx()
+        y = self.widget.winfo_rooty() + self.widget.winfo_height()
+        x = x + self.xoffset
+        y = y + self.yoffset
+        self.tooltip = Tkinter.Toplevel()
+        self.tooltip.wm_iconify()
+        self.tooltip.wm_overrideredirect(1)
+        self.tooltip.wm_protocol("WM_DELETE_WINDOW", self.destroy)
+        self.label = Tkinter.Label(self.tooltip, text=self.text,
+                         relief=self.relief, justify=self.justify,
+                         fg=self.fg, bg=self.bg, bd=1, takefocus=0)
+        self.label.pack(ipadx=1, ipady=1)
+        self.tooltip.wm_geometry("%+d%+d" % (x, y))
+        self.tooltip.wm_deiconify()
+
+if __name__ == "__main__":
+   root=Tkinter.Tk()
+   label = Tkinter.Label(root, text="coucou")
+   label.pack()
+   tp=TOOLTIP(label,"texte d'aide")
+   root.mainloop()
+
diff --git a/InterfaceTK/treeitemincanvas.py b/InterfaceTK/treeitemincanvas.py
new file mode 100644 (file)
index 0000000..05239c9
--- /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
+import Tkinter,Pmw
+
+# Modules Eficas
+from Editeur import Objecttreeitem
+import treewidget
+
+class TREEITEMINCANVAS:
+   def __init__(self,object,nom="",parent=None,appli=None,sel=None,rmenu=None):
+      self.object=object
+      self.nom=nom
+
+      if not appli:
+         class Appli:
+            def affiche_infos(self,message):
+               pass
+         appli=Appli()
+      self.appli=appli
+
+      if not parent:
+         parent=Tkinter.Tk()
+         Pmw.initialise(parent)
+      self.parent=parent
+
+      self.item=Objecttreeitem.make_objecttreeitem(self.appli,self.nom,self.object)
+      self.canvas=Pmw.ScrolledCanvas(self.parent,borderframe=1,canvas_background='gray95')
+      self.canvas.pack(padx=10,pady=10,fill = 'both', expand = 1)
+      if not sel:
+         def sel(event=None):
+            return
+      self.tree=treewidget.Tree(self.appli,self.item,self.canvas,command=sel,rmenu=rmenu)
+      self.tree.draw()
+
+   def mainloop(self):
+      self.parent.mainloop()
+
+   def update(self):
+      """Cette methode est utilisee pour signaler une mise a jour des objets associes"""
+      self.tree.update()
+
+   def supprime(self):
+      #print "supprime",self
+      self.tree.supprime()
+      self.tree=None
+      self.canvas.destroy()
+      self.canvas=None
+
+   #def __del__(self):
+   #   print "__del__",self
+
diff --git a/InterfaceTK/treewidget.py b/InterfaceTK/treewidget.py
new file mode 100644 (file)
index 0000000..2cdae73
--- /dev/null
@@ -0,0 +1,945 @@
+# -*- 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 os,sys,string,re,types,traceback
+from Tkinter import *
+
+
+from InterfaceTK import fontes
+import images
+from Ihm import CONNECTOR
+
+#
+__version__="$Name: BR_V1_12qt $"
+__Id__="$Id: treewidget.py,v 1.32 2007-06-15 15:52:04 cchris Exp $"
+#
+
+Fonte_Standard = fontes.standard
+
+class Tree :
+    def __init__(self,appli,jdc_item,scrolledcanvas,command = None,rmenu=None):
+        self.item = jdc_item
+        self.scrolledcanvas = scrolledcanvas
+        self.canvas = self.scrolledcanvas.component('canvas')
+        #resolution
+        resolution= self.canvas.winfo_screenwidth()/(self.canvas.winfo_screenmmwidth()/25.4*72)
+        self.DDY=max(20,resolution*(Fonte_Standard[1]+4))
+        self.id_up=self.canvas.bind("<F11>", self.page_up)
+        self.id_down=self.canvas.bind("<F12>", self.page_down)
+        self.id_um=self.canvas.bind("<Key-Left>", self.mot_up)
+        self.id_dm=self.canvas.bind("<Key-Right>", self.mot_down)
+        self.id_s=self.canvas.bind("<1>", self.canvas_select)             
+        self.tree = self
+        self.command = command
+        self.rmenu=rmenu
+        self.appli = appli
+        self.parent = None
+        self.racine = self
+        self.node_selected = None
+        self.build_children()
+
+    def canvas_select(self,event):
+        self.canvas.focus_set()
+
+    def page_up(self,event):
+        event.widget.yview_scroll(-1, "page")
+
+    def page_down(self,event):
+        event.widget.yview_scroll(1, "page")
+   
+    def unit_up(self,event):
+        event.widget.yview_scroll(-1, "unit")
+
+    def unit_down(self,event):
+        event.widget.yview_scroll(1, "unit")              
+
+    def mot_down(self,event):
+        self.select_next(None)
+        self.canvas.focus_set()
+
+    def mot_down_force(self):
+        self.select_next(None)
+        self.canvas.focus_set()
+
+    def mot_up(self,event):
+        self.node_selected.select_mot_previous()
+        self.canvas.focus_set()
+
+    def mot_up_force(self):
+        self.node_selected.select_mot_prev()
+        self.canvas.focus_set()
+
+    def deplieReplieNode(self):
+        self.node_selected.deplieReplieNode()
+
+    def build_children(self):
+        """ Construit la liste des enfants de self """
+        self.children = []
+        child = self.item.itemNode(self,self.item,self.command,self.rmenu)
+        self.children.append(child)
+        child.state='expanded'
+
+    def draw(self):
+        """ Dessine l'arbre """
+        lasty = 8
+        x = 5
+        for child in self.children:
+            child.draw(x,lasty)
+            lasty = child.lasty + 15
+        self.children[0].select()
+        self.resizescrollregion()
+
+    def deselectall(self):
+        """ déselectionne tous les éléments de l'arbre """
+        if self.node_selected :
+            self.node_selected.deselect()
+            
+    def update(self):
+        """ Update tous les éléments de l'arbre """
+        for child in self.children:
+            child.update()
+
+    def supprime(self):
+        """ supprime tous les éléments de l'arbre """
+        #print "supprime",self
+        self.canvas.unbind("<F11>",self.id_up)
+        self.canvas.unbind("<F12>",self.id_down)
+        self.canvas.unbind("<Key-Left>",self.id_um)
+        self.canvas.unbind("<Key-Right>",self.id_dm)
+        self.canvas.unbind("<1>",self.id_s)             
+        self.tree = None
+        self.racine = None
+        self.node_selected = None
+        self.item = None
+        self.scrolledcanvas = None
+        self.canvas = None
+        self.command = None
+        self.rmenu=None
+        for child in self.children:
+            child.supprime()
+        self.children=[]
+
+    def update_valid(self) :
+        """Cette methode a pour but de mettre a jour la validite du noeud
+           et de propager la demande de mise à jour à son parent
+        """
+        pass
+
+    def resizescrollregion(self):
+        x0,y0,x1,y1=self.canvas.bbox(ALL)
+        # On ajoute une marge approximativement de la moitié du canvas
+        y1=y1+self.canvas.winfo_height()/2
+        self.canvas.configure(scrollregion = (x0,y0,x1,y1))
+
+    def select_next(self,event):
+        self.node_selected.select_next()
+        self.canvas.focus_set()
+
+    def select_previous(self,event):
+        self.node_selected.select_previous()
+
+    def see(self,items):
+        x1, y1, x2, y2=apply(self.canvas.bbox, items)
+        while x2 > self.canvas.canvasx(0)+self.canvas.winfo_width():
+            old=self.canvas.canvasx(0)
+            self.canvas.xview_scroll( 1, 'units')
+            # avoid endless loop if we can't scroll
+            if old == self.canvas.canvasx(0):
+                break
+        while y2 > self.canvas.canvasy(0)+self.canvas.winfo_height():
+            old=self.canvas.canvasy(0)
+            self.canvas.yview_scroll( 1, 'units')
+            if old == self.canvas.canvasy(0):
+                break
+        # done in this order to ensure upper-left of object is visible
+        while x1 < self.canvas.canvasx(0):
+            old=self.canvas.canvasx(0)
+            self.canvas.xview_scroll( -1, 'units')
+            if old == self.canvas.canvasx(0):
+                break
+        while y1 < self.canvas.canvasy(0):
+            old=self.canvas.canvasy(0)
+            self.canvas.yview_scroll( -1, 'units')
+            if old == self.canvas.canvasy(0):
+                break
+
+    #def __del__(self):
+    #   print "__del__",self
+
+class Node :
+    def __init__(self,parent,item,command=None,rmenu=None):
+        self.parent = parent
+        self.item = item
+        self.connect()
+        self.command = command
+        self.rmenu=rmenu
+        self.tree = self.parent.tree
+        self.appli = self.parent.appli
+        self.canvas = self.parent.canvas
+        self.init()
+
+    def init(self):
+        self.state='collapsed'
+        self.displayed = 0
+        self.selected = 0
+        self.x = self.y  =None
+        self.lasty = 0
+        self.children = None
+        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 __del__(self):
+    #    print "__del__",self
+
+    def force_select(self):
+        if self.selected:
+           # le noeud est selectionné. On force la reconstruction du panel associé
+           if self.command:apply(self.command,(None,))
+           self.select()
+
+    def onValid(self):
+        #print "onValid : l'item a changé de validité ",self.item,self.item.object,self.item.object.isvalid()
+        self.update_node_valid()
+        self.update_node_label()
+        self.update_node_texte()
+        if self.selected and self.command:
+           self.command(self)
+
+    def onAdd(self,objet):
+        #print "onAdd : un objet a été ajouté aux fils de l'item ",self.item.object,objet
+        self.expand_node()
+        old_nodes=self.children
+        self.update_nodes()
+        self.redraw_children(old_nodes)
+        self.force_select()
+
+    def onSupp(self,objet):
+        #print "onSupp : un objet a été supprimé des fils de l'item ",self.item.object,objet
+        self.expand_node()
+        old_nodes=self.children
+        self.update_nodes()
+        self.redraw_children(old_nodes)
+        self.force_select()
+
+    def update_nodes(self):
+        #print "update_nodes",self
+        newnodes=[]
+        inodes=iter(self.children)
+        sublist=self.item._GetSubList()
+        iliste=iter(sublist)
+
+        while(1):
+           old_item=item=None
+           for node in inodes:
+              old_item=node.item
+              if old_item in sublist:break
+              #print "item supprime",old_item
+           for item in iliste:
+              if item is old_item:break
+              #print "item ajoute",item
+              child = item.itemNode(self,item,self.command,self.rmenu)
+              newnodes.append(child)
+
+           if old_item is None and item is None:break
+           if old_item is item:
+              #print "item conserve",item
+              newnodes.append(node)
+
+        self.children=newnodes
+        self.connect()
+
+    def supprime(self):
+        #print "supprime",self
+        self.efface_node()
+        self.racine = None
+        self.command = None
+        self.rmenu=None
+        if not self.children : return
+        for child in self.children:
+            child.supprime()
+        self.children=None
+
+    def redraw_children(self,old_nodes):
+        #print "redraw_children",old_nodes
+        #print self.children
+        y = self.y + self.tree.DDY
+        x = self.x + 15
+        supp_nodes=[]
+
+        inodes=iter(old_nodes)
+        iliste=iter(self.children)
+        # on parcourt la liste des anciens noeuds (node)
+        # et la liste des nouveaux noeuds (new_node) en parallele (iterateurs)
+
+        while(1):
+           new_node=node=None
+           for node in inodes:
+              #print "ancien noeud",node
+              if node in self.children:break # ancien noeud toujours present
+              #print "noeud supprime",node,node.item.GetLabelText()[0]
+              dy=node.y-node.lasty -self.tree.DDY
+              #print "deplacer noeuds",y,dy
+              node.move_nodes(y,dy)
+              node.supprime()
+              #supp_nodes.append(node)
+
+           for new_node in iliste:
+              #print "nouveau noeud",new_node
+              if new_node in old_nodes: break # nouveau noeud deja present
+              #print "noeud ajoute",new_node,new_node.item.GetLabelText()[0]
+              y=self.draw_node(new_node,x,y)
+
+           if node is None and new_node is None : break
+
+           if node is new_node: # ancien noeud
+              #print "noeud conserve",node
+              node.update_node_label()
+              y=y+node.lasty-node.y +self.tree.DDY
+
+        self.racine.update_coords()
+        self.canvas.delete('line')
+        self.racine.trace_ligne()
+        self.tree.resizescrollregion()
+        # Mettre à 1 pour verifier les cycles entre objets node
+        #withCyclops=0
+        #if withCyclops:
+           #from Misc import Cyclops
+           #z = Cyclops.CycleFinder()
+           #print supp_nodes
+           #for o in supp_nodes:
+             #z.register(o)
+           #del supp_nodes
+           #del o
+           #z.find_cycles()
+           #z.show_stats()
+           #z.show_cycles()
+
+    def tag_move_nodes(self,y):
+        """ Marque pour deplacement tous les noeuds au dela de l'ordonnée y """
+        #print "tag_move_nodes",y
+        self.canvas.dtag(ALL,'move')
+        # on marque tous les ids au dela de y
+        x0, y0, x1, y1 = self.canvas.bbox(ALL)
+        if y > y1: # pas d'objet a deplacer
+           return
+        self.canvas.addtag_overlapping('move',x0,y,x1,y1)
+
+    def move_nodes(self,y,dy):
+        """ Déplace de l'incrément dy les noeuds au dela de l'ordonnée y """
+        #print "move_nodes",y,dy
+        self.tag_move_nodes(y)
+        # on déplace tous les items de dy
+        self.canvas.move('move',0,dy)
+
+    def draw_node(self,new_node,x,y):
+        """ Dessine le noeud new_node en x,y en deplacant les noeuds existants
+            en y et au dela
+            Retourne la position du premier des noeuds deplaces
+        """
+        #print "draw_node",new_node,x,y
+        self.tag_move_nodes(y)
+        #if new_node.item.isactif():
+           #new_node.state = 'expanded'
+        new_node.state = 'expanded'
+        new_node.draw(x,y)
+        dy=(new_node.get_nb_children()+1)*self.tree.DDY
+        #print "deplacer noeuds",y,dy
+        self.canvas.move('move',0,dy)
+        return new_node.lasty+self.tree.DDY
+
+    def build_children(self):
+        """ Construit la liste des enfants de self """
+        self.children = []
+        sublist = self.item._GetSubList()
+        if not sublist : return
+        for item in sublist :
+            child = item.itemNode(self,item,self.command,self.rmenu)
+            self.children.append(child)
+            
+    #-----------------------------------------------
+    # Méthodes de sélection/déselection d'un noeud
+    #-----------------------------------------------
+    
+    def select(self, event=None):
+        """
+        Rend le noeud courant (self) sélectionné et déselectionne
+        tous les autres
+        """
+        #print "SELECT",self
+        if not self.children : self.build_children()
+        self.tree.deselectall()
+        self.selected = 1
+        self.tree.node_selected = self
+        if self.command:apply(self.command,(self,))
+        self.highlight()
+        self.make_visible()
+
+    def deselect(self, event=None):
+        """ Déselectionne self """
+        self.selected = 0
+        if self.displayed == 1 : self.dehighlight()
+            
+    def make_visible(self):
+        """ Rend l'objet self visible cad déplace le scroll pour que self 
+            soit dans la fenêtre de visu
+        """
+        lchild=self.last_child()
+        self.tree.see((self.image_id,lchild.image_id))
+        
+    def select_next(self,ind=0):
+        """ on doit chercher à sélectionner dans l'ordre:
+            - son premier fils s'il est affiché
+            - son frère cadet s'il existe
+            - son oncle (benjamin de son père)
+            - ... appel récursif ...
+        """
+        if self.state=='expanded' and len(self.children) > ind:
+            self.children[ind].select()
+        else :
+            index = self.parent.children.index(self) + 1
+            try :
+              if isinstance(self.parent,TREE) :
+                try:
+                    self.children[ind].select()
+                except:
+                    self.children[0].select()
+            except :
+              if self.parent is self.tree:
+                pass
+              else :
+                self.parent.select_next(index)
+
+    def select_mot_prev(self):
+        index = self.parent.children.index(self) - 1
+        try :
+           if index > -1  :
+              self.parent.children[index].select()
+              if self.parent.children[index].state=="expanded":
+                 print len(self.parent.children[index].children)
+                 if len(self.parent.children[index].children)!=0 :
+                    max=len(self.parent.children[index].children) - 1
+                    self.parent.children[index].children[max].select()
+                 else :
+                    self.parent.children[index].select()
+              else :
+                 self.parent.children[index].select()
+           elif self.parent is self.tree:
+              pass
+           else :
+              self.parent.select()
+        except:
+            if self.parent is self.tree:
+               pass
+            else :
+               self.parent.select_previous()
+
+        
+    def select_mot_previous(self):
+        index = self.parent.children.index(self) - 1
+        try :
+            if index > -1  :
+               self.parent.children[index].select()
+            elif self.parent is self.tree:
+               pass
+            else :
+               self.parent.select()
+        except:
+            if self.parent is self.tree:
+               pass
+            else :
+               self.parent.select_previous()
+
+    def select_previous(self):
+        """ on doit d'abord sélectionner(dans l'ordre) :
+             - son frère aîné
+             - son père
+        """
+        index = self.parent.children.index(self) - 1
+        try :
+            self.parent.children[index].select()
+        except:
+            #self.parent.select()
+            if self.parent is self.tree:
+               pass
+            else :
+               self.parent.select_previous()
+
+    def popup(self,event=None):
+        """
+            Declenche le traitement associé au clic droit de la souris
+            sur l'icone du Node
+        """
+        if not self.rmenu:return
+        apply(self.rmenu,(self,event))
+
+    #-----------------------------------------------
+    # Méthodes de recherche d'informations
+    #-----------------------------------------------
+    def geticonimage(self,name=None):
+        """
+        Retourne l'image qui doit être associée à self
+        """
+        if not name :
+            name = self.item.GetIconName()
+        if not name or name == 'aucune' :
+            return None
+        return images.get_image(name)
+
+    def get_nb_children(self):
+        """ Retourne le nombre d'enfants affichés de self """
+        nb = 0
+        if self.state =='collapsed' :  return nb
+        for child in self.children :
+            nb = nb + 1 + child.get_nb_children()
+        return nb
+
+    def get_liste_id(self):
+        """ Retourne la liste de tous les id (filiation comprise) de self """
+        liste = self.id
+        for child in self.children:
+            liste.extend(child.get_liste_id())
+        return liste
+
+    def get_node_fils(self,name) :
+        """ Retourne le fils de self de nom name s'il existe"""
+        for child in self.children:
+            if child.item.get_nom() == name: return child
+        return None
+
+    #-----------------------------------------------
+    # Méthodes d'affichage d'un noeud
+    #-----------------------------------------------
+    def draw(self,x,y):
+        """ Permet de tracer le noeud self """
+        # le début du noeud est en x,y
+        self.x = x
+        self.y = y
+        self.lasty = y
+        self.displayed = 1
+        self.id=[]
+        # choix de l'icone à afficher : + ou -
+        if self.item.IsExpandable():
+            if self.state == 'expanded':
+                iconname = "minusnode"
+                callback = self.collapse
+            else:
+                iconname = "plusnode"
+                callback = self.expand
+            image = self.geticonimage(name=iconname)
+            self.icone_id = self.canvas.create_image(self.x, self.y, image=image)
+            self.callback_id=self.canvas.tag_bind(self.icone_id, "<1>", callback)
+            self.id.append(self.icone_id)
+        # création de la ligne horizontale
+        self.ligne_id = self.canvas.create_line(self.x,self.y,self.x+10,self.y)
+        self.id.append(self.ligne_id)
+        self.canvas.tag_lower(self.ligne_id)
+        # affichage de l'icone (carre ,rond, ovale ...) de couleur
+        image = self.geticonimage()
+        if image != None :
+            self.image_id = self.canvas.create_image(self.x+15,self.y,image = image)
+            self.select_id2=self.canvas.tag_bind(self.image_id,"<1>",self.select)
+            self.popup_id2=self.canvas.tag_bind(self.image_id,"<3>",self.popup)
+            self.id.append(self.image_id)
+        else:
+            self.image_id = None
+        # affichage du texte : nom de l'objet (ETAPE ou MOT-CLE) et sa valeur
+        self.drawtext()
+        if self.state == 'expanded' :
+            if not self.children : self.build_children()
+            if len(self.children) > 0:
+                self.drawchildren()
+                self.lasty = self.children[-1].lasty
+   
+    def drawchildren(self):
+        """ Dessine les enfants de self """
+        y = self.y + self.tree.DDY
+        x = self.x + 15
+        for child in self.children:
+            child.draw(x,y)
+            nb = child.get_nb_children()
+            y = y + self.tree.DDY*(nb+1)
+        self.trace_ligne()
+
+    def drawtext(self):
+        """ Affiche les deux zones de texte après l'icône de couleur de l'objet """
+        if self.image_id != None :
+            textx = self.x + 30
+        else:
+            textx = self.x + 15
+        texty = self.y
+        # nom,fonte et couleur de l'objet du noeud à afficher
+        labeltext,fonte,couleur = self.item.GetLabelText()
+        if labeltext    == ''   : labeltext = '   '
+        if fonte        == None : fonte = Fonte_Standard
+        if couleur      == None : couleur = 'black'
+        # création du widget label
+        self.label = Label(self.canvas,
+                           text = labeltext,
+                           fg = couleur,
+                           bg = 'gray95',
+                           font=fonte)
+        self.label_id = self.canvas.create_window(textx,texty,window=self.label,anchor='w')
+        self.id.append(self.label_id)
+        # bindings sur le widget label
+        self.select_id=self.label.bind("<1>", self.select)
+        self.popup_id=self.label.bind("<3>", self.popup)
+        self.enter_id=self.label.bind("<Enter>",self.enter)
+        self.leave_id=self.label.bind("<Leave>",self.leave)
+        # valeur de cet objet à afficher
+        x0, y0, x1, y1 = self.canvas.bbox(self.label_id)
+        textx = max(x1, 200) + 10
+        text = self.item.GetText() or " "
+        self.text = Label(self.canvas, text=text,
+                            bd=0, padx=2, pady=2,background='gray95',
+                            font=fonte)
+        if self.selected:
+            self.highlight()
+        else:
+            self.dehighlight()
+        self.text_id = self.canvas.create_window(textx, texty,anchor="w", window=self.text)
+        self.id.append(self.text_id)
+        
+    def highlight(self,event=None):
+        """ Met en surbrillance self"""
+        if hasattr(self,'label'):
+            self.label.configure(fg='white',bg='#00008b')
+        if (hasattr(self.item,'get_nom') and hasattr( self.appli, 'salome')) :
+            if self.item.get_nom() == "AFFE_CARA_ELEM":
+               self.item.rmenu_specs=[("View3D", "visu_3D")]
+               self.tree.rmenu
+              
+            
+    def dehighlight(self,event=None):
+        """ Rétablit l'affichage normal de self"""
+        if hasattr(self,'label'):
+            self.label.configure(fg='black',bg='gray95')
+
+    def enter(self,event=None):
+        """ Met en surbrillance self et affiche le fr de l'objet """
+        self.highlight()
+        fr = self.item.get_fr()
+        self.appli.affiche_infos(fr)
+        
+    def leave(self,event=None):
+        """ Rétablit l'affichage normal de self et efface le fr de l'objet """
+        if not self.selected :
+            self.dehighlight()
+        self.appli.affiche_infos('')
+
+    def collapse_children(self):
+        """ Collapse récursivement tous les descendants de self """
+        if not self.children : return
+        for child in self.children:
+            child.state='collapsed'
+            child.collapse_children()
+
+    def deplieReplieNode(self):           
+        if self.state == 'expanded':
+           self.collapse()
+        else :
+           self.expand_node()
+
+    def collapse(self,event = None):
+        """ Collapse self et descendants et retrace self """
+        nb = self.get_nb_children()
+        self.state = 'collapsed'
+        self.collapse_children()
+        self.redraw(-nb)
+        self.select()
+   
+    def expand_node(self,event = None):
+        """ Expanse self et le retrace """
+        if self.state == 'expanded':return
+        #if not self.item.isactif() : return
+        if not self.children : self.build_children()
+        self.state = 'expanded'
+        nb = self.get_nb_children()
+        self.redraw(nb)
+
+    def expand(self,event = None):
+        """ Expanse self et le retrace """
+        self.expand_node()
+        self.select()
+
+    def redraw(self,nb):
+        """ Redessine self :  nb est le décalage à introduire
+            en dessous de self pour le redessiner """
+        # nb = nombre d'items de décalage
+        self.move(self.tree.DDY*nb)
+        # on efface self et on le redessine
+        self.efface()
+        self.draw(self.x,self.y)
+        # Il n'est pas nécessaire d'appeler update
+        # il suffit d'updater les coordonnees et de retracer les lignes
+        self.racine.update_coords()
+        self.racine.trace_ligne()
+        self.update_valid()
+        self.tree.resizescrollregion()
+        
+    def update_coords(self):
+        """ Permet d'updater les coordonnes de self et de tous ses enfants"""
+        if self.displayed == 0 : return
+        if self.image_id != None :
+            coords = self.canvas.coords(self.image_id)
+            self.x = coords[0]-15
+        else:
+            coords = self.canvas.coords(self.label_id)
+            self.x = coords[0]-15
+        self.y = coords[1]
+        self.lasty = self.y
+        if self.state == 'expanded' :
+            for child in self.children:
+                if child.displayed != 0:
+                    child.update_coords()
+                    self.lasty = child.lasty
+
+    def update_icone(self):
+        """ Met à jour les icônes de tous les noeuds : teste la validité de l'objet
+        Cette méthode est très lente, trop !!"""
+        if self.image_id != None :
+            image = self.geticonimage()
+            self.canvas.itemconfig(self.image_id,image=image)
+        if self.state == 'expanded':
+            for child in self.children:
+                if child.displayed != 0:
+                    child.update_icone()
+
+    def update_label_texte(self):
+        """ Met a jour le label du noeud et celui de tous ses fils ouverts """
+        self.update_node_label()
+        if self.state == 'expanded' :
+            for child in self.children:
+                if child.displayed != 0 : child.update_label_texte()
+
+    def update_texte(self):
+        """ Met à jour les noms des SD et valeurs des mots-clés """
+        self.update_node_texte()
+        if self.state == 'expanded' :
+            for child in self.children:
+                if child.displayed != 0 : child.update_texte()
+        
+    def update_node_label(self):
+        """ Met a jour le label du noeud """
+        if self.displayed == 0 : return
+        # nom,fonte et couleur de l'objet du noeud à afficher
+        labeltext,fonte,couleur = self.item.GetLabelText()
+        if labeltext    == ''   : labeltext = '   '
+        if fonte        == None : fonte = Fonte_Standard
+        if couleur      == None : couleur = 'black'
+        self.label.configure(text=labeltext,font=fonte)
+
+    def update_node_texte(self):
+        """ Met à jour les noms des SD et valeurs des mots-clés """
+        if self.displayed == 0 : return
+        text = self.item.GetText()
+        if text == None : text = ''
+        self.text.configure(text=text)
+
+    def update_node_valid(self) :
+        """Cette methode remet a jour la validite du noeud (icone)
+           Elle appelle isvalid
+        """
+        if self.displayed == 0 : return
+        if self.image_id != None :
+            image = self.geticonimage()
+            self.canvas.itemconfig(self.image_id,image=image)
+
+    def update_valid(self) :
+        """Cette methode a pour but de mettre a jour la validite du noeud
+           et de propager la demande de mise à jour à son parent
+        """
+        self.update_node_valid()
+        self.parent.update_valid()
+
+    def update(self,event=None) :
+        """ Classe Node :
+            Cette méthode est appelée pour demander l update d un noeud 
+            d'un jeu de commandes
+            Cette demande est transmise au noeud racine (le JDC) qui update
+            tout l arbre représentant le jeu de commandes
+            Pendant cette mise à jour, on appelle la méthode isvalid qui
+            fera l update de tous les objets déclarés modifiés lors des
+            actions précédentes
+            La métode isvalid est en général appelée par l intermédiaire de
+            update_icone -> geticonimage -> GetIconName
+        """
+        #print "update",self
+        #traceback.print_stack()
+        self.racine.update_coords()
+        self.racine.trace_ligne()
+        self.racine.update_icone()
+        self.racine.update_texte()
+        self.racine.update_label_texte()
+        self.tree.resizescrollregion()
+
+    def efface_node(self):
+        if self.displayed != 0:
+           self.label.unbind("<1>", self.select_id)
+           self.label.unbind("<3>", self.popup_id)
+           self.label.unbind("<Enter>",self.enter_id)
+           self.label.unbind("<Leave>",self.leave_id)
+           self.canvas.tag_unbind(self.image_id,"<1>",self.select_id2)
+           self.canvas.tag_unbind(self.image_id,"<3>",self.popup_id2)
+           if self.item.IsExpandable():
+              self.canvas.tag_unbind(self.icone_id, "<1>", self.callback_id)
+           self.label.destroy()
+           self.text.destroy()
+
+        for id in self.id :
+            self.canvas.delete(id)
+        self.id=[]
+        self.label_id=None
+        self.text_id=None
+        self.image_id=None
+        self.icone_id=None
+        self.label=None
+        self.text=None
+        self.displayed=0
+
+    def efface(self):
+        """ Efface du canvas les id associés à self : cad les siens et ceux
+            de ses enfants """
+        self.efface_node()
+        if not self.children : return
+        for child in self.children:
+            child.efface()
+
+    def move(self,dy):
+        """ Déplace de l'incrément dy tous les id en dessous de self """
+        # il faut marquer tous les suivants de self
+        bbox1 = self.canvas.bbox(ALL)
+        self.canvas.dtag(ALL,'move')
+        self.canvas.delete('line')
+        try:
+            self.canvas.addtag_overlapping('move',bbox1[0],self.y +10,bbox1[2],bbox1[3])
+        except:
+            print "Erreur dans move :"
+            print self
+            print self.item
+            print self.item.getObject()
+            print self.item.getObject().definition.label
+            print 'y=',self.y
+            print 'dy=',dy
+        # on déplace tous les items de dy
+        self.canvas.move('move',0,dy)
+
+    def trace_ligne(self):
+        """ Dessine les lignes verticales entre frères et entre père et premier fils"""
+        if self.state=='collapsed' : return
+        if len(self.children)==0 : return
+        # on est bien dans le cas d'un noeud expansé avec enfants ...
+        # il faut rechercher l'ordonnée du dernier fils de self
+        y_end = self.children[-1].y
+        ligne = self.canvas.create_line(self.x+15,self.y,self.x+15,y_end,tags='line')
+        self.canvas.tag_lower(ligne)
+        for child in self.children :
+            try:
+                child.trace_ligne()
+            except:
+                print "Erreur dans trace_ligne :"
+                print child
+                print child.item.getObject()
+
+    def last_child(self):
+        lchild=self
+        if self.state == 'expanded' and self.children:
+           lchild= self.children[-1].last_child()
+        return lchild
+
+    #------------------------------------------------------------------
+    # Méthodes de création et destruction de noeuds
+    # Certaines de ces méthodes peuvent être appelées depuis l'externe
+    #------------------------------------------------------------------
+    def append_brother(self,name,pos='after',retour='non'):
+        """
+        Permet d'ajouter un objet frère à l'objet associé au noeud self
+        par défaut on l'ajoute immédiatement après 
+        Méthode externe
+        """
+        # on veut ajouter le frère de nom name directement avant ou après self
+        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 à l'objet associé au noeud self.
+           On peut l'ajouter en début de liste (pos='first'), en fin (pos='last')
+           ou en position intermédiaire.
+           Si pos vaut None, on le place à la position du catalogue.
+        """
+        #print "append_child",self,self.children
+        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)
+        #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):
+        """ 
+            Méthode externe pour la destruction de l'objet associé au noeud
+            La mise à jour des noeuds est faite par onSupp sur notification
+        """
+        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()
+
diff --git a/InterfaceTK/uniqueassdpanel.py b/InterfaceTK/uniqueassdpanel.py
new file mode 100644 (file)
index 0000000..ad9ed24
--- /dev/null
@@ -0,0 +1,219 @@
+# -*- coding: utf-8 -*-
+# ======================================================================
+# 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 Tkinter import *
+import Pmw
+from copy import copy,deepcopy
+import traceback
+
+# Modules Eficas
+from Editeur import Objecttreeitem
+from Aster import prefs
+import panels
+import images
+from widgets import ListeChoix
+from widgets import FenetreDeSelection
+
+from Noyau.N_CR import justify_text
+from Editeur.utils import substract_list
+
+# Import des panels
+from uniquepanel import UNIQUE_Panel
+
+
+class UNIQUE_ASSD_Panel(UNIQUE_Panel):
+  """
+  Classe servant à définir le panneau associé aux objets qui attendent une valeur unique
+  d'un type dérivé d'ASSD
+  """
+  def valid_valeur_automatique(self):
+      """
+         Réalise la validation d'un concept sans remonter dans le
+         node parent dans le cas ou il n'y a qu'un concept possible (liste de longueur 1)
+         Identique à valid_valeur moins appel de self.node.parent.select()
+         On pourrait supposer que le seul concept présent est valide et donc ne pas
+         réaliser tous les tests de vérification.
+      """
+      if self.parent.modified == 'n' : self.parent.init_modif()
+      valeur = self.get_valeur()
+      self.erase_valeur()
+      anc_val = self.node.item.get_valeur()
+      valeur,validite=self.node.item.eval_valeur_item(valeur)
+      test = self.node.item.set_valeur(valeur)
+      if not test :
+          mess = "impossible d'évaluer : %s " %`valeur`
+          self.parent.appli.affiche_infos("Valeur du mot-clé non autorisée :"+mess)
+      elif self.node.item.isvalid() :
+          self.parent.appli.affiche_infos('Valeur du mot-clé enregistrée')
+          #if self.node.item.get_position()=='global':
+              #self.node.etape.verif_all()
+          #elif self.node.item.get_position()=='global_jdc':
+              #self.node.racine.verif_all()
+          #else :
+              #self.node.parent.verif()
+          #self.node.update()
+      else :
+          cr = self.node.item.get_cr()
+          mess = "Valeur du mot-clé non autorisée :"+cr.get_mess_fatal()
+          self.reset_old_valeur(anc_val,mess=mess)
+
+  def makeValeurPage(self,page,reel="non"):
+      """
+          Génère la page de saisie de la valeur du mot-clé simple courant qui doit être une 
+          SD de type dérivé d'ASSD
+      """
+      # Récupération de l'aide associée au panneau, de l'aide destinée à l'utilisateur,
+      # et de la liste des SD du bon type (constituant la liste des choix)
+      bulle_aide=self.get_bulle_aide()
+      aide=self.get_aide()
+      aide= justify_text(texte=aide)
+      liste_noms_sd = self.node.item.get_sd_avant_du_bon_type()
+
+      # Remplissage du panneau
+      self.valeur_choisie = StringVar()
+      self.valeur_choisie.set('')
+      min,max =  self.node.item.GetMinMax()
+      if (min == 1 and min == max and len(liste_noms_sd)==1 ):
+          if self.valeur_choisie.get() != liste_noms_sd[0]:
+            if ('R' not in self.node.item.get_type()) :
+                self.valeur_choisie.set(liste_noms_sd[0])
+                self.valid_valeur_automatique()
+         
+      self.frame_valeur = Frame(page)
+      self.frame_valeur.pack(fill='both',expand=1)
+      self.frame_valeur.bind("<Button-3>",lambda e,s=self,a=bulle_aide : s.parent.appli.affiche_aide(e,a))
+      self.frame_valeur.bind("<ButtonRelease-3>",self.parent.appli.efface_aide)
+      self.listbox = Pmw.ScrolledListBox(self.frame_valeur,
+                                         items=liste_noms_sd,
+                                         labelpos='n',
+                                         label_text="Structures de données du type\n requis par l'objet courant :",
+                                         listbox_height = 6,
+                                         selectioncommand=self.select_valeur_from_list,
+                                         dblclickcommand=lambda s=self,c=self.valid_valeur : s.choose_valeur_from_list(c))
+      self.listbox.place(relx=0.5,rely=0.3,relheight=0.4,anchor='center')
+      Label(self.frame_valeur,text='Structure de donnée choisie :').place(relx=0.05,rely=0.6)
+      Label(self.frame_valeur,textvariable=self.valeur_choisie).place(relx=0.5,rely=0.6)
+      self.but_val = Button(self.frame_valeur,text = "Valider",command= self.Choisir)
+      self.but_val.place(relx=0.3,rely=0.8,relwidth=0.35)
+
+      # affichage de la valeur courante
+      self.display_valeur()
+      if self.__class__.__name__ == 'UNIQUE_ASSD_Panel_Reel' :
+        Label(self.frame_valeur,text='Valeur Réelle').place(relx=0.1,rely=0.9)
+        self.entry = Entry(self.frame_valeur,relief='sunken')
+        self.entry.place(relx=0.28,rely=0.9,relwidth=0.6)
+        self.entry.bind("<Return>",lambda e,c=self.valid_valeur_reel:c())
+        self.entry.bind("<KP_Enter>",lambda e,c=self.valid_valeur_reel:c())
+
+
+
+  def get_bulle_aide(self):
+      """
+      Retourne l'aide associée au panneau
+      """
+      return "Double-cliquez sur la structure de donnée désirée pour valoriser le mot-clé simple courant"
+
+  def get_aide(self):
+      """
+      Retourne la phrase d'aide indiquant de quel type doit être la valeur à donner par l'utilisateur
+      """
+      mc = self.node.item.get_definition()
+      try :
+              type = mc.type[0].__name__  
+      except :
+        type = str(mc.type[0])
+      if len(mc.type)>1 :
+          for typ in mc.type[1:] :
+              try :
+                l=typ.__name__
+              except:
+                l=str(typ)
+              type = type + ' ou '+l
+      commentaire="Un objet de type "+type+" est attendu"
+      aideval=self.node.item.aide()
+      commentaire=commentaire +"\n"+ aideval
+      return commentaire
+
+    
+  def select_valeur_from_list(self):
+      """
+      Affecte à valeur choisie la sélection courante dans la liste des choix proposée
+      """
+      if len(self.listbox.get()) == 0 : return
+      if len(self.listbox.getcurselection()) == 0 : return
+      choix = self.listbox.getcurselection()[0]
+      self.valeur_choisie.set(choix)
+      self.listbox.component("listbox").focus_set()
+
+  def choose_valeur_from_list(self,command):
+      """
+      Affecte à valeur choisie la sélection courante dans la liste des choix proposée
+      Exécute command
+      """
+      if len(self.listbox.get()) == 0 : return
+      if len(self.listbox.getcurselection()) == 0 : return
+      choix = self.listbox.getcurselection()[0]
+      self.valeur_choisie.set(choix)
+      apply(command,(),{})
+
+  def Choisir(self) :
+      #Appeler par le bouton Valider
+      self.choose_valeur_from_list(self.valid_valeur)
+      
+  def get_valeur(self):
+      """
+      Retourne la valeur donnée par l'utilisateur au MCS
+      """
+      return self.valeur_choisie.get()
+    
+  def display_valeur(self):
+      """
+      Affiche la valeur de l'objet pointé par self
+      """
+      valeur = self.node.item.get_valeur()
+      if valeur == None or valeur == '' : return # pas de valeur à afficher ...
+      self.valeur_choisie.set(getattr(valeur,"nom","unknown"))
+
+  def erase_valeur(self):
+      pass
+
+  def appel_make(self,page):
+      self.makeValeurPage(page,reel="oui")
+      
+class UNIQUE_ASSD_Panel_Reel(UNIQUE_ASSD_Panel):
+  def valid_valeur_reel(self):
+      if self.parent.modified == 'n' : self.parent.init_modif()
+      anc_val = self.node.item.get_valeur()
+      valeurentree = self.entry.get()
+      self.valeur_choisie.set(valeurentree)
+      self.valid_valeur()
+
+  def display_valeur(self):
+      valeur = self.node.item.get_valeur()
+      if valeur == None or valeur == '' : return # pas de valeur à afficher ...
+      if type(valeur) == types.FloatType :
+         self.valeur_choisie.set(valeur)
+      else :
+         self.valeur_choisie.set(valeur.nom)
+
+       
+
diff --git a/InterfaceTK/uniquebasepanel.py b/InterfaceTK/uniquebasepanel.py
new file mode 100644 (file)
index 0000000..707fc28
--- /dev/null
@@ -0,0 +1,153 @@
+# -*- 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 Tkinter import *
+from Tkinter import Widget
+import Pmw
+from copy import copy,deepcopy
+import traceback
+
+# Modules Eficas
+from Editeur import Objecttreeitem
+from Aster import prefs
+import panels
+import images
+from widgets import FenetreDeParametre
+from widgets import showerror
+
+from Noyau.N_CR import justify_text
+from Editeur.utils import substract_list
+
+# Import des panels
+from uniquepanel import UNIQUE_Panel
+
+
+class UNIQUE_BASE_Panel(UNIQUE_Panel):
+  """
+  Classe servant à définir le panneau associé aux mots-clés simples qui attendent
+  une valeur d'un type de base (entier, réel ou string).
+  """
+  def makeValeurPage(self,page):
+      """
+      Génère la page de saisie de la valeur du mot-clé simple courant qui doit être de type
+      de base cad entier, réel, string ou complexe
+      """
+      # Récupération de l'aide associée au panneau, de l'aide destinée à l'utilisateur,
+      # et de la liste des SD du bon type (constituant la liste des choix)
+      bulle_aide=self.get_bulle_aide()
+      aide=self.get_aide()
+      aide= justify_text(texte=aide)
+      liste_noms_sd = self.node.item.get_sd_avant_du_bon_type()
+      # Remplissage du panneau
+      self.frame_valeur = Frame(page)
+      self.frame_valeur.pack(fill='both',expand=1)
+      self.frame_valeur.bind("<Button-3>",lambda e,s=self,a=bulle_aide : s.parent.appli.affiche_aide(e,a))
+      self.frame_valeur.bind("<ButtonRelease-3>",self.parent.appli.efface_aide)
+      self.label = Label(self.frame_valeur,text='Valeur :')
+      #self.label.place(relx=0.1,rely=0.2)
+      self.label.grid(row=0,padx=5,pady=5)
+      self.entry = Entry(self.frame_valeur,relief='sunken')
+      #self.entry.place(relx=0.28,rely=0.2,relwidth=0.6)
+      self.entry.grid(row=0,column=1,padx=5,pady=5)
+      self.entry.bind("<Return>",lambda e,c=self.valid_valeur:c())
+      self.entry.bind("<KP_Enter>",lambda e,c=self.valid_valeur:c())
+      # aide associée au panneau
+      self.frame_valeur.update()
+      self.aide = Label(self.frame_valeur, 
+                        text = aide,
+                        wraplength=int(self.frame_valeur.winfo_width()*0.8),
+                        justify='center')
+      #self.aide.place(relx=0.5,rely=0.9,anchor='n')
+      self.aide.grid(row=4,columnspan=2,padx=5,pady=5)
+      # bouton parametre
+      bouton_parametres = Button(self.frame_valeur, text="Parametres", command=self.affiche_parametre)
+      #bouton_parametres.place(relx=0.28,rely=0.5,relwidth=0.4)
+      bouton_parametres.grid(row=2,columnspan=2,padx=5,pady=5)
+      bouton_val = Button(self.frame_valeur, text="Valider", command=self.valide)
+      #bouton_val.place(relx=0.28,rely=0.6,relwidth=0.4)
+      bouton_val.grid(row=3,columnspan=2,padx=5,pady=5)
+      # affichage de la valeur du MCS
+      self.display_valeur()
+
+  def valide(self):
+      self.valid_valeur()
+
+  def affiche_parametre(self) :
+     if self.node.item.get_liste_param_possible() != [ ]:
+        txtparam=""
+        for param in self.node.item.get_liste_param_possible():
+           txtparam=txtparam+repr(param)+"\n"
+        if txtparam=="":
+           showerror("Aucun parametre ","Pas de parametre de ce type")
+        else :
+           try :
+                   self.fenetreparam.destroy()
+           except :
+                pass
+           self.fenetreparam=FenetreDeParametre( self, self.node.item, self.parent.appli, txtparam)
+
+  def destroy(self):
+      try :
+              self.fenetreparam.destroy()
+      except :
+        pass
+      Widget.destroy(self)
+
+  def get_aide(self):
+      """
+      Retourne la phrase d'aide indiquant de quel type doit être la valeur
+      du mot-clé simple fournie par l'utilisateur
+      """
+      mc = self.node.item.get_definition()
+      d_aides = { 'TXM' : "Une chaîne de caractères est attendue",
+                  'R'   : "Un réel est attendu",
+                  'I'   : "Un entier est attendu"}
+      type = mc.type[0]
+      commentaire=d_aides.get(type,"Type de base inconnu")
+      aideval=self.node.item.aide()
+      commentaire=commentaire +"\n"+ aideval
+      return commentaire
+
+  def get_bulle_aide(self):
+      """
+      Retourne la bulle d'aide associée au panneau et affichée par clic droit
+      """
+      return """Saisissez la valeur que vous voulez affecter au mot-clé simple
+      dans la zone de saisie et pressez <Return>"""
+      
+  def display_valeur(self):
+      """
+      Affiche la valeur de l'objet pointé par self
+      """
+      valeur = self.node.item.get_valeur()
+      if valeur == None or valeur == '' : # pas de valeur à afficher ...
+         self.entry.delete(0,END)
+         self.entry.focus()
+         return
+
+      valeur_texte=self.get_valeur_texte(valeur)
+      if valeur_texte != "":
+         valeur=valeur_texte
+      self.entry.delete(0,END)
+      self.entry.insert(0,valeur)
+      self.entry.focus()
+      
diff --git a/InterfaceTK/uniquecomppanel.py b/InterfaceTK/uniquecomppanel.py
new file mode 100644 (file)
index 0000000..b7fdf61
--- /dev/null
@@ -0,0 +1,171 @@
+# -*- 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 Tkinter import *
+import Pmw
+from copy import copy,deepcopy
+import traceback
+
+# Modules Eficas
+from Editeur import Objecttreeitem
+from Aster import prefs
+import panels
+import images
+from widgets import ListeChoix
+from widgets import FenetreDeSelection
+
+from Noyau.N_CR import justify_text
+from Editeur.utils import substract_list
+
+# Import des panels
+from uniquepanel import UNIQUE_Panel
+
+      
+class UNIQUE_COMP_Panel(UNIQUE_Panel):
+  """
+  Classe servant à définir le panneau associé aux mots-clés simples
+  qui attendent une valeur de type complexe
+  """
+  def makeValeurPage(self,page):
+      """
+      Génère la page de saisie de la valeur du mot-clé simple courant qui doit être de type
+      de base cad entier, réel, string ou complexe
+      """
+      # Récupération de l'aide associée au panneau et de l'aide destinée à l'utilisateur
+      bulle_aide=self.get_bulle_aide()
+      aide=self.get_aide()
+      aide= justify_text(texte=aide)
+      # Remplissage du panneau
+      self.frame_valeur = Frame(page)
+      self.frame_valeur.pack(fill='both',expand=1)
+      self.frame_valeur.bind("<Button-3>",lambda e,s=self,a=bulle_aide : s.parent.appli.affiche_aide(e,a))
+      self.frame_valeur.bind("<ButtonRelease-3>",self.parent.appli.efface_aide)
+      self.label  = Label(self.frame_valeur,text='Complexe de la forme : a+bj')
+      self.label1 = Label(self.frame_valeur,text='Imaginaire')
+      self.label2 = Label(self.frame_valeur,text='Phase')
+      self.label3 = Label(self.frame_valeur,text='OU')
+      self.label.place (relx=0.15,rely=0.1)
+      self.label1.place(relx=0.6,rely=0.50)
+      self.label2.place(relx=0.6,rely=0.57)
+      self.label3.place(relx=0.15,rely=0.4)
+      self.typ_cplx=StringVar()
+      self.typ_cplx.set('RI')
+      rb1 = Radiobutton(self.frame_valeur, text='RI  : Réel',variable=self.typ_cplx,value='RI')
+      rb2 = Radiobutton(self.frame_valeur, text='MP  : Module',variable=self.typ_cplx,value='MP')
+      rb1.place(relx=0.15,rely = 0.50)
+      rb2.place(relx=0.15,rely = 0.57)
+      self.entry1 = Pmw.EntryField(self.frame_valeur,validate='real')
+      self.entry2 = Pmw.EntryField(self.frame_valeur,validate='real')
+      self.entry3 = Pmw.EntryField(self.frame_valeur)
+      self.entry1.component('entry').bind("<Return>",lambda e,s=self:s.entry2.component('entry').focus())
+      self.entry1.component('entry').bind("<KP_Enter>",lambda e,s=self:s.entry2.component('entry').focus())
+      self.entry2.component('entry').bind("<Return>",lambda e,c=self.valid_valeur:c())
+      self.entry2.component('entry').bind("<KP_Enter>",lambda e,c=self.valid_valeur:c())
+      self.entry3.component('entry').bind("<Return>",lambda e,c=self.valid_complexe:c())
+      self.entry3.component('entry').bind("<KP_Enter>",lambda e,c=self.valid_complexe:c())
+      self.entry1.place(relx=0.15,rely = 0.65,relwidth=0.35)
+      self.entry2.place(relx=0.60,rely = 0.65,relwidth=0.35)
+      self.entry3.place(relx=0.15,rely = 0.20,relwidth=0.60)
+      self.entry1.focus()
+      self.bouton_val=Button(self.frame_valeur,text="Valider",command=self.valider,width=14)
+      self.bouton_val.place(relx=0.4,rely=0.8)
+      self.frame_valeur.update()
+      self.aide = Label(self.frame_valeur,
+                        text = aide,
+                        wraplength=int(self.frame_valeur.winfo_width()*0.8),
+                        justify='center')
+      self.aide.place(relx=0.5,rely=0.9,anchor='n')
+      # affichage de la valeur du MCS
+      self.display_valeur()
+
+  def valider(self):
+      if ((self.entry3.get() != None) and (self.entry3.get() != "" )):
+         self.erase_valeur()
+         self.valid_complexe()
+      else :
+         self.valid_valeur()
+         
+
+  def display_valeur(self):
+      """
+      Affiche la valeur de l'objet pointé par self
+      """
+      valeur = self.node.item.get_valeur()
+      if valeur == None or valeur == '' : return # pas de valeur à afficher ...
+      self.entry1.delete(0,END)
+      self.entry2.delete(0,END)
+      self.entry3.delete(0,END)
+      if type(valeur) not in (types.ListType,types.TupleType) :
+         self.display_complexe()
+      else:
+         typ_cplx,x1,x2=valeur
+         self.typ_cplx.set(typ_cplx)
+         self.entry1.setentry(x1)
+         self.entry2.setentry(x2)
+
+  def display_complexe(self):
+      valeur = self.node.item.get_valeur()
+      self.entry3.setentry(valeur)
+
+  def get_bulle_aide(self):
+      """
+      Retourne la bulle d'aide du panneau
+      """
+      return """-Choisissez votre format de saisie du complexe :
+      \t 'RI' = parties réelle et imaginaire
+      \t 'MP' = module/phase (en degrés)
+      - Saisissez ensuite dans les deux zones de saisie les deux nombres attendus"""
+
+  def get_aide(self):
+      """
+      Retourne la phrase d'aide décrivant le type de la valeur que peut prendre
+      le mot-clé simple courant
+      """
+      commentaire='Un complexe est attendu'
+      aideval=self.node.item.aide()
+      commentaire=commentaire +"\n"+ aideval
+      return commentaire
+
+  def get_valeur(self):
+      """
+      Retourne le complexe saisi par l'utilisateur
+      """
+      l=[]
+      l.append(self.typ_cplx.get())
+      try :
+         l.append(string.atof(self.entry1.get()))
+         l.append(string.atof(self.entry2.get()))
+      except :
+         return None
+      return `tuple(l)`
+
+  def erase_valeur(self):
+      """
+      Efface les entries de saisie
+      """
+      self.typ_cplx.set('RI')
+      self.entry1.delete(0,END)
+      self.entry2.delete(0,END)
+      
+  def valid_complexe(self):
+      valeurentree=self.entry3.get()
+      self.valid_valeur(valeurentree=valeurentree)
diff --git a/InterfaceTK/uniqueintopanel.py b/InterfaceTK/uniqueintopanel.py
new file mode 100644 (file)
index 0000000..5c6552b
--- /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.
+#
+#
+# ======================================================================
+# Modules Python
+import string,types,os
+from Tkinter import *
+import Pmw
+from copy import copy,deepcopy
+import traceback
+
+# Modules Eficas
+from Editeur import Objecttreeitem
+from Aster import prefs
+import panels
+import images
+from widgets import ListeChoix
+from widgets import FenetreDeSelection
+
+from Noyau.N_CR import justify_text
+from Editeur.utils import substract_list
+
+# Import des panels
+from uniquepanel import UNIQUE_Panel
+
+class UNIQUE_INTO_Panel(UNIQUE_Panel):
+  """
+  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 makeValeurPage(self,page):
+      """
+      Génère la page de saisie d'une seule valeur parmi un ensemble
+      discret de possibles
+      """
+      # récupération de la bulle d'aide et de l'objet mc
+      bulle_aide=self.get_bulle_aide()
+      objet_mc = self.node.item.get_definition()
+      # remplissage du panel
+      self.frame_valeur = Frame(page)
+      self.frame_valeur.pack(fill='both',expand=1)
+      self.frame_valeur.bind("<Button-3>",lambda e,s=self,a=bulle_aide : 
+                              s.parent.appli.affiche_aide(e,a))
+      self.frame_valeur.bind("<ButtonRelease-3>",self.parent.appli.efface_aide)
+      #l_choix=list(objet_mc.into)
+      #l_choix.sort()
+      l_choix=self.node.item.get_liste_possible([])
+      self.label = Label(self.frame_valeur,text='Choisir une valeur :')
+      self.label.pack(side='top')
+      self.frame = Frame(page)
+      self.frame.place(relx=0.33,rely=0.2,relwidth=0.33,relheight=0.6)
+
+
+      liste_commandes = (("<Button-1>",self.selectChoix),
+                         ("<Button-3>",self.deselectChoix),
+                         ("<Double-Button-1>",self.record_valeur))
+      self.Liste_choix = ListeChoix(self,self.frame,l_choix,
+                                    liste_commandes = liste_commandes,
+                                    titre="Valeurs possibles",optionReturn="oui")
+      self.Liste_choix.affiche_liste()
+      self.bouton_val = Button(self.frame_valeur,
+                               text = "Valider",
+                               command=self.record_valeur_ligne,
+                               width=14)
+      self.bouton_val.place(relx=0.33,rely=0.85)
+
+  def record_valeur_ligne(self):
+      valeur=self.Liste_choix.arg_selected
+      self.record_valeur(valeur)
+
+  def get_bulle_aide(self):
+      """
+      Retourne la bulle d'aide affectée au panneau courant (affichée par clic droit)
+      """
+      return """Double-cliquez sur la valeur désirée
+      pour valoriser le mot-clé simple courant"""
+
diff --git a/InterfaceTK/uniquepanel.py b/InterfaceTK/uniquepanel.py
new file mode 100644 (file)
index 0000000..4e3a603
--- /dev/null
@@ -0,0 +1,93 @@
+# -*- 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 Tkinter import *
+import Pmw
+from copy import copy,deepcopy
+import traceback
+
+# Modules Eficas
+from Editeur import Objecttreeitem
+from Aster import prefs
+import panels
+import images
+from widgets import ListeChoix
+from widgets import FenetreDeSelection
+
+from Noyau.N_CR import justify_text
+from Editeur.utils import substract_list
+
+# Import des panels
+from newsimppanel import newSIMPPanel
+
+    
+class UNIQUE_Panel(newSIMPPanel):
+  """
+  Classe virtuelle servant de classe mère à toutes celles définissant un panneau
+  permettant l'affichage et la saisie d'une valeur unique pour le mot-clé simple
+  """
+
+  def erase_valeur(self):
+      """
+      Efface l'entry de saisie
+      """
+      self.entry.delete(0,END)
+
+  def get_valeur(self):
+      """
+      Retourne la valeur donnée par l'utilisateur
+      """
+      return self.entry.get()
+    
+  
+  def valid_valeur(self,valeurentree=None):
+      """
+      Teste si la valeur fournie par l'utilisateur est une valeur permise :
+      - si oui, l'enregistre
+      - si non, restaure l'ancienne valeur
+      """
+      if self.parent.modified == 'n' : self.parent.init_modif()
+      anc_val = self.node.item.get_valeur()
+      if valeurentree== None :
+         valeurentree = self.get_valeur()
+      valeur,validite=self.node.item.eval_valeur(valeurentree)
+      if not validite :
+             commentaire = "impossible d'évaluer : %s " %`valeurentree`
+             self.display_valeur()
+             self.parent.appli.affiche_infos(commentaire)
+             return
+   
+      test = self.node.item.set_valeur(valeur)
+      if test :
+          self.set_valeur_texte(str(valeurentree))
+       
+      if not test :
+          mess = "impossible d'évaluer : %s " %`valeur`
+          self.parent.appli.affiche_infos("Valeur du mot-clé non autorisée : "+mess)
+      elif self.node.item.isvalid() :
+          self.parent.appli.affiche_infos('Valeur du mot-clé enregistrée')
+      else :
+          cr = self.node.item.get_cr()
+          mess = "Valeur du mot-clé non autorisée "+cr.get_mess_fatal()
+          self.reset_old_valeur(anc_val,mess=mess)
+
+      self.display_valeur()
diff --git a/InterfaceTK/uniquesdcopanel.py b/InterfaceTK/uniquesdcopanel.py
new file mode 100644 (file)
index 0000000..9722862
--- /dev/null
@@ -0,0 +1,246 @@
+# -*- 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 Tkinter import *
+import Pmw
+from copy import copy,deepcopy
+import traceback
+
+# Modules Eficas
+from Editeur import Objecttreeitem
+from Aster import prefs
+import panels
+import images
+from widgets import ListeChoix
+from widgets import FenetreDeSelection
+
+from Noyau.N_CR import justify_text
+from Editeur.utils import substract_list
+
+# Import des panels
+from uniqueassdpanel import UNIQUE_ASSD_Panel
+
+
+class UNIQUE_SDCO_Panel(UNIQUE_ASSD_Panel):
+  """
+  Classe servant à définir le panneau correspondant à un mot-clé simple
+  qui attend une valeur unique de type dérivé d'ASSD ou non encore
+  existante (type CO(...) utilisé dans les macros uniquement)
+  """
+  def makeValeurPage(self,page):
+      """
+      Génère la page de saisie de la valeur du mot-clé simple courant qui doit être une SD de type dérivé
+      d'ASSD
+      """
+      # Récupération de l'aide associée au panneau, de l'aide destinée à l'utilisateur,
+      # et de la liste des SD du bon type (constituant la liste des choix)
+      bulle_aide=self.get_bulle_aide()
+      aide=self.get_aide()
+      aide= justify_text(texte=aide)
+      liste_noms_sd = self.node.item.get_sd_avant_du_bon_type()
+      # Remplissage du panneau
+      self.frame_valeur = Frame(page)
+      self.frame_valeur.pack(fill='both',expand=1)
+      self.frame_valeur.bind("<Button-3>",lambda e,s=self,a=bulle_aide : s.parent.appli.affiche_aide(e,a))
+      self.frame_valeur.bind("<ButtonRelease-3>",self.parent.appli.efface_aide)
+      # affichage de la liste des SD existantes et du bon type
+      self.listbox = Pmw.ScrolledListBox(self.frame_valeur,
+                                         items=liste_noms_sd,
+                                         labelpos='n',
+                                         label_text="Structures de données du type\n requis par l'objet courant :",
+                                         listbox_height = 6,
+                                         selectioncommand=self.select_valeur_from_list,
+                                         dblclickcommand=lambda s=self,c=self.valid_valeur : s.choose_valeur_from_list(c))
+      self.listbox.component("listbox").bind("<Return>",lambda e,s=self,c=self.valid_valeur : s.choose_valeur_from_list(c))
+      if liste_noms_sd != [] :
+         self.listbox.place(relx=0.5,rely=0.3,relheight=0.4,anchor='center')
+         self.b_co = Pmw.OptionMenu(self.frame_valeur,labelpos='w',label_text = "Nouveau concept : ", items = ('NON','OUI'),
+                                         menubutton_width=10)
+      else :
+         self.b_co = Pmw.OptionMenu(self.frame_valeur,labelpos='w',label_text = "Nouveau concept : ", items = ('OUI',),
+                                         menubutton_width=10)
+      # affichage du bouton 'Nouveau concept'
+      self.b_co.configure(command = self.ask_new_concept)
+      if liste_noms_sd != [] :
+         self.b_co.place(relx=0.05,rely=0.6,anchor='w')
+      else :
+         self.b_co.place(relx=0.05,rely=0.3,anchor='w')
+      self.label_co = Label(self.frame_valeur,text='Nom du nouveau concept :')
+      self.entry_co = Entry(self.frame_valeur)
+      self.entry_co.bind('<Return>',self.valid_nom_concept_co)
+      self.entry_co.bind('<KP_Enter>',self.valid_nom_concept_co)
+      # affichage du label de la structure de donnée choisie
+      self.l_resu = Label(self.frame_valeur,text='Structure de donnée choisie :')
+      self.valeur_choisie = StringVar()
+      self.label_valeur = Label(self.frame_valeur,textvariable=self.valeur_choisie)
+      self.frame_valeur.update()
+      self.aide = Label(self.frame_valeur,
+                        text = aide,
+                        wraplength=int(self.frame_valeur.winfo_width()*0.8),
+                        justify='center')
+      self.aide.place(relx=0.5,rely=0.85,anchor='n')
+
+      self.but_val = Button(self.fr_but,text = "Valider",command= self.valid_nom_concept_co)
+      self.but_val.pack(side='right',padx=5, pady=5)
+
+      # affichage de la valeur courante
+      self.display_valeur()
+      if liste_noms_sd == [] :
+          self.b_co.invoke('OUI')
+      
+  def get_bulle_aide(self):
+      """
+      Retourne la bulle d'aide du panneau
+      """
+      return """Double-cliquez sur la structure de donnée désirée
+      pour valoriser le mot-clé simple courant ou cliquez sur NOUVEAU CONCEPT pour
+      entrer le nom d'un concept non encore existant"""
+
+  def valid_valeur(self):
+      """
+      Teste si la valeur fournie par l'utilisateur est une valeur permise :
+      - si oui, l'enregistre
+      - si non, restaure l'ancienne valeur
+      """
+      if self.parent.modified == 'n' : self.parent.init_modif()
+      valeur = self.get_valeur()
+      #print "valid_valeur",valeur
+
+      self.erase_valeur()
+      anc_val = self.node.item.get_valeur()
+      test_CO=self.node.item.is_CO(anc_val)
+      #PN essai pour bug dans MACRO_PROJ_BASE 
+      valeur,validite=self.node.item.eval_valeur(valeur)
+      test = self.node.item.set_valeur(valeur)
+      if not test :
+          mess = "impossible d'évaluer : %s " %`valeur`
+          self.parent.appli.affiche_infos("Valeur du mot-clé non autorisée :"+mess)
+          return
+      #PN essai pour bug dans MACRO_PROJ_BASE 
+      #elif self.node.item.isvalid() :
+      elif validite: 
+          self.parent.appli.affiche_infos('Valeur du mot-clé enregistrée')
+          if test_CO:
+             # il faut egalement propager la destruction de l'ancien concept
+             self.node.item.delete_valeur_co(valeur=anc_val)
+             # et on force le recalcul des concepts de sortie de l'etape
+             self.node.item.object.etape.get_type_produit(force=1)
+             # et le recalcul du contexte
+             self.node.item.object.etape.parent.reset_context()
+          self.node.parent.select()
+      else :
+          cr = self.node.item.get_cr()
+          mess = "Valeur du mot-clé non autorisée :"+cr.get_mess_fatal()
+          self.reset_old_valeur(anc_val,mess=mess)
+          return
+
+  def valid_nom_concept_co(self,event=None):
+      """
+      Lit le nom donné par l'utilisateur au concept de type CO qui doit être
+      la valeur du MCS courant et stocke cette valeur
+      """
+      #print "valid_nom_concept_co"
+      if self.parent.modified == 'n' : self.parent.init_modif()
+      anc_val = self.node.item.get_valeur()
+      if anc_val != None:
+          # il faut egalement propager la destruction de l'ancien concept
+          self.node.item.delete_valeur_co(valeur=anc_val)
+          # et on force le recalcul des concepts de sortie de l'etape
+          self.node.item.object.etape.get_type_produit(force=1)
+          # et le recalcul du contexte
+          self.node.item.object.etape.parent.reset_context()
+      nom_concept = self.entry_co.get()
+      #print "valid_nom_concept_co",nom_concept
+      test,mess=self.node.item.set_valeur_co(nom_concept)
+      if not test:
+          # On n'a pas pu créer le concept
+          self.parent.appli.affiche_infos(mess)
+          return
+      elif self.node.item.isvalid() :
+          self.parent.appli.affiche_infos('Valeur du mot-clé enregistrée')
+          self.node.parent.select()
+      else :
+          cr = self.node.item.get_cr()
+          mess = "Valeur du mot-clé non autorisée :"+cr.get_mess_fatal()
+          self.reset_old_valeur(anc_val,mess=mess)
+          return
+
+  def ask_new_concept(self,tag):
+      """
+      Crée une entry dans le panneau d'un MCS qui attend un concept OU un CO() afin de
+      permettre à l'utilisateur de donner le nom du nouveau concept
+      """
+      new_concept = self.b_co.getcurselection()
+      if new_concept == 'OUI':
+          self.label_co.place(relx=0.05,rely=0.7)
+          self.entry_co.place(relx=0.45,rely=0.7,relwidth=0.25)
+          self.l_resu.place_forget()
+          self.label_valeur.place_forget()
+          self.entry_co.focus()
+      elif new_concept == 'NON':
+          # On est passe de OUI à NON, on supprime la valeur
+# PN correction de bug (on passe de non a non et cela supprime la valeur)
+# ajout du if de le ligne suivane
+          if self.node.item.is_CO():
+                self.node.item.delete_valeur_co()
+                self.record_valeur(name=None,mess="Suppression CO enregistrée")
+                self.label_co.place_forget()
+                self.entry_co.place_forget()
+                self.l_resu.place(relx=0.05,rely=0.7)
+                self.label_valeur.place(relx=0.45,rely=0.7)
+          
+  def display_valeur(self):
+      """
+      Affiche la valeur de l'objet pointé par self
+      """
+      valeur = self.node.item.get_valeur()
+      #print "display_valeur",valeur
+      if valeur == None or valeur == '': 
+         self.valeur_choisie.set('')
+         return # pas de valeur à afficher ...
+      # il faut configurer le bouton si la valeur est un objet CO
+      # sinon afficher le nom du concept dans self.valeur_choisie
+      if self.node.item.is_CO():
+          #print "display_valeur.is_CO"
+          self.b_co.invoke('OUI')
+          self.entry_co.insert(0,valeur.nom)
+      else:
+          self.valeur_choisie.set(valeur.nom)
+
+  def record_valeur(self,name=None,mess='Valeur du mot-clé enregistrée'):
+      """
+      Enregistre  val comme valeur de self.node.item.object SANS faire de test de validité
+      """
+      if self.parent.modified == 'n' : self.parent.init_modif()
+      if name != None:
+          valeur =name
+      else :
+          self.entry_co.delete(0,END)
+          valeur= self.entry_co.get()
+      self.node.item.set_valeur_co(valeur)
+      self.parent.appli.affiche_infos(mess)
+      # On met a jour le display dans le panneau
+      self.display_valeur()
+      if self.node.item.isvalid():
+          self.node.parent.select()
+
+
diff --git a/InterfaceTK/widgets.py b/InterfaceTK/widgets.py
new file mode 100644 (file)
index 0000000..d43053b
--- /dev/null
@@ -0,0 +1,1386 @@
+# -*- 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.
+#
+#
+# ======================================================================
+# ----------------------------------------------------------
+#   Cette classe sert à définir les widgets utilisés par
+#          EFICAS
+# ----------------------------------------------------------
+
+import Tkinter
+from Tkinter import *
+import Pmw
+import os,sys,re,string
+import types,fnmatch
+import traceback
+from tkFileDialog import *
+from tkMessageBox import showinfo,askyesno,showerror,askretrycancel
+
+from InterfaceTK import fontes
+from Aster import prefs
+from Editeur.utils import save_in_file
+from centerwindow import centerwindow
+
+from Noyau.N_utils import repr_float
+from Accas import AsException
+
+# Surcharge de la fonction askyesno qui retourne un resultat errone en Python 2.3 avec Tk 8.4
+# et Tkinter.wantobject==1
+import tkMessageBox
+def askyesno(title=None, message=None, **options):
+    "Ask a question; return true if the answer is yes"
+    s = tkMessageBox._show(title, message, tkMessageBox.QUESTION, tkMessageBox.YESNO, **options)
+    if s == tkMessageBox.YES:return 1
+    if s == tkMessageBox.NO:return 0
+    if s:return 1
+    return 0
+
+    
+class Fenetre :
+    """ Cette classe permet de créer une fenêtre Toplevel dans laquelle
+        on peut afficher un texte et qui permet de le sauver"""
+    def __init__(self,appli,titre="",texte="",wrap=WORD,width=100,height=30):
+        self.appli=appli
+        if self.appli.test==1 : return
+        self.fenetre = Toplevel()
+        self.fenetre.withdraw()
+        #self.fenetre.configure(width = 800,height=500)
+        self.fenetre.protocol("WM_DELETE_WINDOW", self.quit)
+        self.fenetre.title("Visualisation du "+titre)
+        self.texte = string.replace(texte,'\r\n','\n')
+        self.titre = titre
+        fonte=fontes.standardcourier10
+        # définition des frames
+        self.frame_texte = Frame(self.fenetre)
+        self.frame_boutons = Frame(self.fenetre)
+        #self.frame_texte.place(relx=0,rely=0,relwidth=1,relheight=0.9)
+        #self.frame_boutons.place(relheight=0.1,relx=0,rely=0.9,relwidth=1.)
+        # définition de la zone texte et du scrollbar
+        self.zone_texte = Text(self.frame_texte,font=fonte,wrap=wrap,
+                               height=height,width=width)
+        self.zone_texte.bind("<Key-Prior>", self.page_up)
+        self.zone_texte.bind("<Key-Next>", self.page_down)
+        self.zone_texte.bind("<Key-Up>", self.unit_up)
+        self.zone_texte.bind("<Key-Down>", self.unit_down)
+        self.scroll_v = Scrollbar (self.frame_texte,command = self.zone_texte.yview)
+        #self.scroll_h = Scrollbar (self.frame_texte,command = self.zone_texte.xview)
+        self.scroll_v.pack(side='right',fill ='y')
+        #self.scroll_h.pack(side='bottom',fill ='x')
+        self.zone_texte.pack(side='top',fill='both',expand=1,padx=5,pady=10)
+        self.zone_texte.configure(yscrollcommand=self.scroll_v.set)
+        # définition des boutons
+        self.but_quit = Button(self.frame_boutons,text = "Fermer",command=self.quit,
+                                default='active')
+        self.but_save = Button(self.frame_boutons,text = "Sauver",command = self.save)
+        #self.but_quit.place(relx=0.4,rely=0.5,anchor='center')
+        #self.but_save.place(relx=0.6,rely=0.5,anchor='center')
+        self.but_quit.pack(side='left',padx=25, pady=5)
+        self.but_save.pack(side='right',padx=25, pady=5)
+        self.frame_texte.pack(side='top',fill='both',expand=1)
+        self.frame_boutons.pack(side='bottom')
+        self.zone_texte.focus_set()
+        self.fenetre.bind('<Return>',self.quit) #dismiss window
+
+        # affichage du texte
+        self.affiche_texte(self.texte)
+        self.zone_texte.config(state=DISABLED)
+        centerwindow(self.fenetre)
+        self.fenetre.deiconify()
+
+    def page_up(self,event):
+        event.widget.yview_scroll(-1, "page")
+        return "break" #Pour eviter la propagation de l'evenement a la fenetre principale
+    def page_down(self,event):
+        event.widget.yview_scroll(1, "page")
+        return "break" #Pour eviter la propagation de l'evenement a la fenetre principale
+    def unit_up(self,event):
+        event.widget.yview_scroll(-1, "unit")
+        return "break" #Pour eviter la propagation de l'evenement a la fenetre principale
+    def unit_down(self,event):
+        event.widget.yview_scroll(1, "unit")
+        return "break" #Pour eviter la propagation de l'evenement a la fenetre principale
+
+    def wait(self):
+        self.fenetre.grab_set()
+        self.zone_texte.focus_set()
+        self.fenetre.wait_window(self.fenetre)
+
+    def quit(self,event=None):
+        self.fenetre.destroy()
+        return "break" #Pour eviter la propagation de l'evenement a la fenetre principale
+
+    def efface_scroll(self):
+        """ Efface le scroll lorsqu'il n'est pas nécessaire : ne marche pas"""
+        self.scroll_v.pack_forget()
+        #self.scroll_h.pack_forget()
+
+    def affiche_texte(self,texte):
+        """ Affiche le texte dans la fenêtre """
+        if texte != "" :
+            self.zone_texte.insert(END,texte)
+            try:
+                self.fenetre.update_idletasks()
+                x0,y0,x1,y1 = self.zone_texte.bbox(END)
+                if (y1-y0) < 300 : self.efface_scroll()
+            except:
+                pass
+
+    def save(self):
+        """ Permet de sauvegarder le texte dans un fichier dont on a demandé le nom
+        à l'utilisateur """
+        file = asksaveasfilename(parent=self.fenetre,defaultextension = '.comm',
+                               #initialdir = self.appli.CONFIGURATION.rep_user,
+                               initialdir = self.appli.CONFIGURATION.initialdir,
+                               title="Sauvegarde du "+self.titre)
+        if file :
+            if not save_in_file(file,self.texte,None) :
+                showerror("Sauvegarde impossible",
+                       "Impossible de sauvegarder le texte dans le fichier spécifié\n"+
+                          "Vérifiez les droits d'écriture",parent=self.fenetre)
+            else:
+                showinfo("Sauvegarde effectuée","Sauvegarde effectuée dans le fichier %s" %file,parent=self.fenetre)
+
+    def destroy(self):
+        try :
+           self.fenetre.destroy()
+        except :
+           pass
+
+class FenetreSurLigneWarning(Fenetre):
+
+    def affiche_texte(self,texte):
+        """ Affiche le texte dans la fenêtre """
+        ligne=0
+        if texte != "" :
+           texte_cr=texte.splitlines()
+           for l in texte_cr:
+                ligne=ligne+1
+                l=l+"\n"
+                self.zone_texte.insert(END,l)
+                if (l.find("WARNING") > -1) or (l.find("ERROR") > -1) : 
+                   self.zone_texte.tag_add( "Rouge", str(ligne)+".0", "end-1c" )
+                   self.zone_texte.tag_config("Rouge", foreground='red')
+           try:
+                self.fenetre.update_idletasks()
+                x0,y0,x1,y1 = self.zone_texte.bbox(END)
+                if (y1-y0) < 300 : self.efface_scroll()
+           except:
+                pass
+
+class FenetreYesNo(Fenetre):
+    def __init__(self,appli,titre="",texte="",yes="Yes",no="No"):
+        self.appli=appli
+        self.fenetre = Toplevel()
+        self.fenetre.configure(width = 800,height=500)
+        self.fenetre.protocol("WM_DELETE_WINDOW", self.quit)
+        self.fenetre.title(titre)
+        self.texte = string.replace(texte,'\r\n','\n')
+        self.titre = titre
+        fonte=fontes.standardcourier10
+        # définition des frames
+        self.frame_texte = Frame(self.fenetre)
+        self.frame_boutons = Frame(self.fenetre)
+        self.frame_boutons.place(relx=0,rely=0,    relwidth=1.,relheight=0.1)
+        self.frame_texte.place(  relx=0,rely=0.1,  relwidth=1, relheight=0.9)
+        # définition de la zone texte et du scrollbar
+        self.zone_texte = Text(self.frame_texte,font=fonte)
+        self.zone_texte.bind("<Key-Prior>", self.page_up)
+        self.zone_texte.bind("<Key-Next>", self.page_down)
+        self.zone_texte.bind("<Key-Up>", self.unit_up)
+        self.zone_texte.bind("<Key-Down>", self.unit_down)
+        self.scroll_v = Scrollbar (self.frame_texte,command = self.zone_texte.yview)
+        #self.scroll_h = Scrollbar (self.frame_texte,command = self.zone_texte.xview)
+        self.scroll_v.pack(side='right',fill ='y')
+        #self.scroll_h.pack(side='bottom',fill ='x')
+        self.zone_texte.pack(side='top',fill='both',expand=1,padx=5,pady=10)
+        self.zone_texte.configure(yscrollcommand=self.scroll_v.set)
+        # définition des boutons
+        self.but_yes = Button(self.frame_boutons,text = yes,command=self.yes)
+        self.but_no = Button(self.frame_boutons,text = no,command = self.no)
+        self.but_yes.place(relx=0.4,rely=0.5,anchor='center')
+        self.but_no.place(relx=0.6,rely=0.5,anchor='center')
+        # affichage du texte
+        self.affiche_texte(self.texte)
+        centerwindow(self.fenetre)
+
+    def yes(self):
+        self.result=1
+        self.quit()
+
+    def no(self):
+        self.result=0
+        self.quit()
+
+class FenetreDeSelection(Fenetre):
+    """ Classe dérivée de Fenêtre permettant la récupération d'une zone de texte sélectionnée.
+        Cette classe est utilisée pour affecter une liste de valeurs à un mot-clé.
+    """
+    def __init__(self,panel,item,appli,titre="",texte="",cardinal=1):
+        Fenetre.__init__(self,appli,titre=titre,texte=texte)
+        self.frame_boutons.place_forget()
+        self.frame_texte.place_forget()
+        self.frame_texte.place(relx=0,rely=0,relwidth=1,relheight=0.8)
+        self.frame_boutons.place(relheight=0.2,relx=0,rely=0.8,relwidth=1.)
+
+        self.cardinal=cardinal
+        self.fenetre.configure(width = 320,height=400)
+        centerwindow(self.fenetre)
+        self.panel = panel
+        self.item = item
+        self.fenetre.title(titre)
+        self.but_save.configure(text="Ajouter",command=self.traite_selection)
+        # séparateur par défaut
+        self.separateur = ';'
+        # création de la zone de saisie du séparateur
+        l_separateurs_autorises = self.get_separateurs_autorises()
+        self.choix_sep = Pmw.ComboBox(self.frame_boutons,
+                                      label_text = "Séparateur :",
+                                      labelpos = 'w',
+                                      listheight = 100,
+                                      selectioncommand = self.choose_separateur,
+                                      scrolledlist_items = l_separateurs_autorises)
+        self.choix_sep.component('entry').configure(width=6)
+        self.choix_sep.place(relx=0.01,rely=0.5,anchor='w')
+        self.choix_sep.selectitem(self.separateur)
+        # Replacement
+        self.but_quit.place_forget()
+        self.but_save.place_forget()
+        self.but_all  = Button(self.frame_boutons,text = "Tout Sélectionner", command=self.tout)
+        self.but_save.place(relx=0.6,rely=0.6,anchor='center')
+        self.but_quit.place(relx=0.8,rely=0.6,anchor='center')
+        self.but_all.place(relx=0.7,rely=0.2,anchor='center')
+        self.choose_separateur('espace')
+     
+
+    def get_separateurs_autorises(self):
+        """
+        Retourne la liste des séparateurs autorisés
+        """
+        return ['espace',';',',']
+
+    def choose_separateur(self,nom_sep):
+        """
+        Affecte à self.separateur le caractère séparateur correspondant à nom_sep
+        """
+        if nom_sep == 'espace' :
+            self.separateur = ' '
+        else:
+            self.separateur = nom_sep
+        
+    def tout(self):
+        liste=[]
+        texte=self.texte.splitlines()
+        for l in texte :
+            for mot in string.split(l,self.separateur):
+               if mot != '' and mot != ' ' and mot != self.separateur :
+                  liste.append(mot)
+        self.traite_selection(liste)
+
+    def traite_selection(self,liste=None):
+        """ Cette méthode effectue tous les traitements nécessaires pour vérifier
+            et affecter la liste de valeurs à l'objet réprésenté par self.item
+        """
+        # Récupère la liste des chaines de caractères de la zone sélectionnée
+        message=""
+        if liste == None:
+           message,liste = self.recupere_liste()
+        if self.test_probleme(message,"Sélectionnez des données") == 0:
+            return
+        # Vérifie que le nombre de données est dans les limites attendues
+        message = self.verif_liste(liste)
+        if self.test_probleme(message,"Vérifiez le nombre de données") == 0:
+            return
+        # Crée une liste de valeurs du type attendu
+        message,liste_valeurs = self.creation_liste_valeurs(liste)
+        if self.test_probleme(message,"Vérifiez le type des données") == 0:
+            return
+        # Vérifie que chaque valeur est dans le domaine exigé
+        message = self.verif_valeurs(liste_valeurs)
+        if self.test_probleme(message,"Vérifiez le domaine des valeurs") == 0:
+            return
+        # Ajoute les valeurs dans la liste de valeurs du mot-clé
+        if self.cardinal != 1 :
+           nb=self.cardinal
+           l_valeurs=[]
+           # a ameliorer
+           if (len(liste_valeurs)%nb != 0):
+                message="La cardinalité n'est pas correcte"
+                self.test_probleme(message,"On attend des tuples")
+                return
+           for i in range(len(liste_valeurs)/nb) :
+               if (nb==2):
+                   t=(liste_valeurs[i*nb], liste_valeurs[i*nb+1])
+               elif (nb ==3):
+                   t=(liste_valeurs[i*nb], liste_valeurs[i*nb+1], liste_valeurs[i*nb+2])
+               else :
+                  print "probleme : prevenir la maintenance Eficas"
+                  return
+               l_valeurs.append(t)
+           liste_valeurs=l_valeurs
+        self.ajouter_valeurs(liste_valeurs)
+        self.appli.affiche_infos("Liste de valeurs acceptée")
+
+    def test_probleme(self, message, message_eficas):
+        """ Cette méthode affiche un message d'erreur si message != ''
+            et retourne 0, sinon retourne 1 sans rien afficher.
+        """
+        if message != "":
+            showinfo("Problème",message,parent=self.fenetre)
+            self.fenetre.tkraise()
+            self.appli.affiche_infos(message_eficas)
+            return 0
+        else:
+            return 1
+
+    def recupere_liste(self):
+        """ Cette méthode récupère le texte de la zone sélectionnée, construit et
+            retourne une liste avec les chaines qui se trouvent entre les séparateurs.
+            S'il n'y a pas de données selectionnées, elle retourne un message d'erreur
+            et une liste vide.
+        """
+        message = ""
+        try:
+            selection=self.fenetre.selection_get()
+        except:
+            message = "Pas de donnée sélectionnée"
+            return message,None
+        # les retours chariots doivent être interprétés comme des séparateurs
+        selection = string.replace(selection,'\n',self.separateur)
+        # on splitte la sélection suivant le caractère séparateur
+        liste_chaines = string.split(selection,self.separateur)
+        l_chaines = []
+        for chaine in liste_chaines:
+            chaine = string.strip(chaine)
+            if chaine != '' : l_chaines.append(chaine)
+        return message,l_chaines
+
+    def verif_liste(self, liste):
+        """ Cette méthode effectue des tests sur le nombre d'éléments de la liste
+            et retourne 1 si la liste est correcte, sinon 0 et le message d'erreur
+            correspondant.
+        """
+        message = ""
+        # nombre d'éléments sélectionnés
+        nombre_elements = len(liste)
+        # nombre d'éléments déja dans la liste du panel
+        nombre_in_liste = len(self.panel.Liste_valeurs.get_liste())
+        multiplicite = self.item.GetMultiplicite()
+        if (nombre_elements % multiplicite) != 0:
+            message = "Vous devez sélectionner "+str(multiplicite)+" * n données"
+            return message
+        nombre_valeurs = nombre_elements / multiplicite
+        cardinalite = self.item.GetMinMax()
+        if nombre_valeurs < cardinalite[0]:
+            message = "Vous devez sélectionner au moins "+str(cardinalite[0])+" valeurs"
+            return message
+        if cardinalite[1] != "**" and nombre_valeurs > (long(cardinalite[1])-nombre_in_liste):
+            message = "La liste ne peut avoir plus de "+str(cardinalite[1])+" valeurs"
+            return message
+
+        return message
+
+    def creation_liste_valeurs(self, liste):
+        """ Cette méthode crée et retourne une liste de valeurs du type attendu
+            par le mot-clé. La liste de valeurs est créée à partir de la liste
+            de chaines de caractères transmise.
+        """
+        type_attendu = self.item.GetType()[0]
+        if type_attendu == 'R':
+            return self.convertir(liste, f_conversion= float)
+        elif type_attendu == 'I':
+            return self.convertir(liste, f_conversion= int)
+        elif type_attendu == 'TXM':
+            return self.convertir(liste)
+        else:
+            message = "Seuls les entiers, les réels et les chaines de caractères sont convertis"
+            return message,None
+
+    def convertir(self, liste, f_conversion=None):
+        """ Cette méthode essaie de convertir les éléments de la liste avec la
+            fonction f_conversion si elle existe, et retourne la liste des
+            éléments dans le type voulu en cas de succès, sinon retourne None.
+        """
+        liste_valeurs = []
+        message = ""
+        for chaine in liste:
+            if f_conversion:
+                try:
+                    liste_valeurs.append(f_conversion(chaine))
+                except:
+                    message = "Impossible de convertir "+chaine+" dans le type attendu"
+                    return message,None
+            else:
+                liste_valeurs.append(chaine)
+        return message,liste_valeurs
+
+    def verif_valeurs(self, liste_valeurs):
+        """ Cette méthode teste la validité de tous les éléments de la liste,
+            retourne un message vide s'ils sont valides
+            ou un message non vide au premier élément non valide rencontré
+        """
+        message = ""
+        for valeur in liste_valeurs:
+            test,message = self.item.object.verif_type(valeur)
+            if test == 0: return message
+        return message
+
+    def ajouter_valeurs(self, liste_valeurs):
+        """ Cette méthode ajoute les nouvelles valeurs à la liste existante."""
+        liste = self.panel.Liste_valeurs.get_liste()
+        liste.extend(liste_valeurs)
+        self.panel.Liste_valeurs.put_liste(liste)
+
+class FenetreDeParametre(Fenetre) :
+    def __init__(self,parent,item,appli,texte):
+        self.parent=parent
+        self.appli=appli
+        self.fenetre = Toplevel()
+        self.fenetre.configure(width = 250,height=100)
+        self.fenetre.protocol("WM_DELETE_WINDOW", self.quit)
+        self.fenetre.title("Parametres")
+        self.titre = "Parametres"
+        self.texte = string.replace(texte,'\r\n','\n')
+        fonte=fontes.standardcourier10
+
+        # définition des frames
+        self.frame_texte = Frame(self.fenetre)
+        self.frame_texte.place(relx=0,rely=0,relwidth=1,relheight=0.7)
+        # définition de la zone texte et du scrollbar
+        self.zone_texte = Text(self.frame_texte,font=fonte)
+        self.zone_texte.bind("<Key-Prior>", self.page_up)
+        self.zone_texte.bind("<Key-Next>", self.page_down)
+        self.zone_texte.bind("<Key-Up>", self.unit_up)
+        self.zone_texte.bind("<Key-Down>", self.unit_down)
+        self.scroll_v = Scrollbar (self.frame_texte,command = self.zone_texte.yview)
+        self.scroll_v.pack(side='right',fill ='y')
+        self.zone_texte.pack(side='top',fill='both',expand=1,padx=5,pady=10)
+        self.zone_texte.configure(yscrollcommand=self.scroll_v.set)
+        # affichage du texte
+        self.affiche_texte(self.texte)
+        self.zone_texte.config(state="disabled")
+
+        # définition des boutons
+        self.frame_boutons = Frame(self.fenetre)
+        self.frame_boutons.place(relheight=0.3,relx=0,rely=0.65,relwidth=1.)
+        self.label1 = Label(self.frame_boutons,text="surligner la")
+        self.label2 = Label(self.frame_boutons,text="ligne entière")
+        self.label1.place(relx=0.1,rely=0)
+        self.label2.place(relx=0.1,rely=0.5)
+        self.but_quit = Button(self.frame_boutons,text = "Fermer",command=self.quit)
+        self.but_save = Button(self.frame_boutons,text = "Choisir",command = self.Choisir)
+        self.but_save.place(relx=0.6,rely=0,relheight=1)
+        self.but_quit.place(relx=0.8,rely=0,relheight=1)
+
+
+    def Choisir(self):
+        try:
+            selection=self.zone_texte.selection_get()
+        except:
+            showerror("Pas de donnée sélectionnée",
+                       "Selectionner un parametre")
+        l_param = ""
+        for param in selection.splitlines():
+            nomparam=param[0:param.find("=")-1]
+            if nomparam != '' : 
+                l_param=l_param+nomparam+','
+        self.parent.entry.delete(0,Tkinter.END)
+        self.parent.entry.insert(0,l_param[0:-1])
+        self.parent.valid_valeur()
+        self.quit()
+
+class Formulaire:
+    """
+    Cette classe permet de créer une boîte Dialog dans laquelle
+    on affiche un formulaire à remplir par l'utilisateur
+    """
+    def __init__(self,fen_pere,obj_pere=None,titre="",texte="",items=(),mode='query',commande=None):
+        self.resultat=0
+        if items in ((),[]) : return
+        self.items = items
+        self.titre = titre
+        self.texte = texte
+        self.fen_pere = fen_pere
+        self.obj_pere = obj_pere
+        self.mode= mode
+        self.command = commande
+        self.display()
+
+    def display(self):
+        self.init_validateurs()
+        self.init_fenetre()
+        self.init_texte()
+        self.init_items_formulaire()
+        self.fenetre.activate(geometry='centerscreenalways')
+
+    def init_validateurs(self):
+        """
+        Crée le dictionnaire des validateurs des objets reconnus par le formulaire
+        """
+        self.d_validateurs = {}
+        self.d_validateurs['rep']  = self.repvalidator
+        self.d_validateurs['file'] = self.filevalidator
+        self.d_validateurs['cata']= self.catavalidator
+        self.d_validateurs['mot']= self.motvalidator
+        self.d_validateurs['mot2']= self.mot2validator
+        self.d_validateurs['mot3']= self.mot3validator
+        self.d_validateurs['mot4']= self.mot4validator
+        
+    def init_fenetre(self):
+        """
+        Crée la fenêtre Dialog
+        """
+        if self.mode == 'query':
+            buttons=('Valider','Annuler')
+            defaultbutton = 'Valider'
+        elif self.mode == 'display':
+            if self.command :
+                buttons=(self.command[0],'OK')
+                defaultbutton = 'OK'
+            else:
+                buttons=('OK')
+                defaultbutton = 'OK'
+        self.fenetre = Pmw.Dialog(self.fen_pere,
+                                  buttons=buttons,
+                                  defaultbutton = defaultbutton,
+                                  title = self.titre,
+                                  command = self.execute)
+        self.fenetre.withdraw()
+        
+    def init_texte(self):
+        """
+        Crée le label qui affiche le texte à l'intérieur du panneau
+        """
+        fonte=fontes.standard
+        fr_texte = Frame(self.fenetre.interior(),height=60)
+        fr_texte.pack(side='top',fill='x',expand=1)
+        Label(fr_texte,text = self.texte, font=fonte).place(relx=0.5,rely=0.5,anchor='center')
+
+    def init_items_formulaire(self):
+        """
+        Crée et affiche les items dans la boîte de dialogue
+        """
+        self.radiobut = 0
+        self.widgets = []
+        self.item_widgets = {}
+        length_maxi = 0
+        for item in self.items:
+            if len(item[0])>length_maxi : length_maxi = len(item[0])
+        window = self.fenetre.interior()
+        for item in self.items :
+            if len(item) == 4 :
+               label,nature,nom_var,defaut = item
+               chaine="Yes" 
+               chaine2="No"
+            else :
+               label,nature,nom_var,defaut,chaine,chaine2 = item
+          
+            # création de la frame
+            fr_item = Frame(window,height=40,width=700)
+            fr_item.pack(side='top',fill='x',expand=1)
+            # création du label
+            Label(fr_item,text = label).place(relx=0.05,rely=0.4)
+            if nature in ('rep','file','cata','mot','mot2','mot3','mot4'):
+                # création de l'entry
+                e_item = Entry(fr_item) 
+                e_item.place(relx=0.5,rely=0.4,relwidth=0.45)
+                self.widgets.append(e_item)
+                self.item_widgets[item] = e_item
+                if defaut : e_item.insert(0,str(defaut))
+            elif nature == 'YesNo':
+                # création de la StringVar
+                var = StringVar()
+                setattr(self,'item_'+nom_var,var)
+                var.set(defaut)
+                # création du radiobouton
+                rb1 = Radiobutton(fr_item,text=chaine,variable=var,value='OUI')
+                rb2 = Radiobutton(fr_item,text=chaine2,variable=var,value='NON')
+                rb1.place(relx=0.65,rely=0.5,anchor='center')
+                rb2.place(relx=0.80,rely=0.5,anchor='center')
+                self.widgets.append((rb1,rb2))
+                self.item_widgets[item] = var
+        # détermination de la méthode à appliquer sur les boutons
+        if self.mode == 'query':
+            function = self.active
+        elif self.mode == 'display':
+            function = self.inactive
+        else:
+            return
+        # on applique la méthode sur les boutons (activation ou désactivation)  
+        for widget in self.widgets :
+            if type(widget) == types.TupleType:
+                for widg in widget :
+                    apply(function,(widg,),{})
+            else:
+                apply(function,(widget,),{})
+
+    def active(self,widget):
+        """
+        Active le widget passé en argument
+        """
+        widget.configure(state='normal',bg='white')
+
+    def inactive(self,widget):
+        """
+        Inactive le widget passé en argument
+        """
+        if not isinstance(widget,Radiobutton) :
+            widget.configure(state='disabled',bg='gray95')
+        else :
+            widget.configure(state='disabled')
+
+# --------------------------------------------------------------------------------
+#       Validateurs des noms de répertoire, de fichiers et de catalogues
+# -------------------------------------------------------------------------------
+
+    def motvalidator(self,text):
+        text2="("+text+")"
+        return self.motlongueurvalidator(text2,1) 
+
+    def mot2validator(self,text):
+        return self.motlongueurvalidator(text,2) 
+
+    def mot3validator(self,text):
+        return self.motlongueurvalidator(text,3) 
+
+    def mot4validator(self,text):
+        return self.motlongueurvalidator(text,4) 
+
+    def motlongueurvalidator(self,text,longueur):
+        try :
+          if ((text[0] != "(") or (text[-1] != ")")) : return 0
+          if len(text.split(",")) != longueur : return 0
+          return 1
+        except :
+          return 0
+
+    def repvalidator(self,text):
+        """
+        Teste si text peut faire référence à un répertoire ou non
+        Retourne 1 si valide, 0 sinon
+        """
+        return os.path.isdir(text),'Répertoire introuvable : %s' %text
+
+    def filevalidator(self,text):
+        """
+        Teste si text peut faire référence à un fichier ou non
+        Retourne 1 si valide, 0 sinon
+        """
+        return os.path.isfile(text),'Fichier introuvable : %s' %text
+
+    def catavalidator(self,text):
+        """
+        Teste si  text est un chemin d'accès valide à un catalogue
+        Retourne 1 si valide, 0 sinon
+        """
+        return os.path.isfile(text),"Catalogue introuvable : %s" %text
+
+# --------------------------------------------------------------------------------
+#       Méthodes callbacks des boutons et de fin
+# --------------------------------------------------------------------------------
+        
+    def execute(self,txt):
+        """
+        Cette commande est activée à chaque clic sur un bouton.
+        Redirige l'action sur la bonne méthode en fonction du bouton activé
+        """
+        if txt == 'Valider':
+            self.fini()
+        elif txt in ('OK','Annuler'):
+            self.quit()
+        elif txt == 'Modifier':
+            self.resultat = apply(self.command[1],(),{})
+            self.fenetre.destroy()
+        else :
+            print "Nom de bouton inconnu"
+            self.quit()
+
+    def fini(self):
+        """
+        Commande qui termine le panneau et sauvegarde les nouvelles options
+        dans l'objet resultat (dictionnaire)
+        """
+        dico={}
+        for item,widget in self.item_widgets.items():
+            nom_var = item[2]
+            type_var = item[1]
+            valeur = widget.get()
+            if self.d_validateurs.has_key(type_var):
+                test = self.d_validateurs[type_var](valeur)
+                if not test :
+                    # une entrée n'est pas valide --> on la met en surbrillance et on quitte la méthode
+                    # sans tuer la fenêtre bien sûr
+                    widget.selection_range(0,END)
+                    return
+            dico[nom_var] = valeur
+        self.fenetre.destroy()    
+        self.resultat=dico
+        
+    def quit(self):
+        self.fenetre.destroy()
+        self.resultat=None
+        
+class ListeChoix :
+    """ Cette classe est utilisée pour afficher une liste de choix passée en paramètre
+        en passant les commandes à lancer suivant différents bindings """
+    def __init__(self,parent,page,liste,liste_commandes=[],liste_marques =[],active ='oui',filtre='non',titre='',
+                 optionReturn=None, fonte_titre=fontes.standard_gras_souligne):
+        self.parent = parent
+        self.page = page
+        self.liste = liste
+        self.dico_labels={}
+        self.dico_mots={}
+        self.nBlabel = 0
+        self.dico_place={}
+       self.dico_mots={}
+        self.selection = None
+        self.liste_commandes = liste_commandes
+        self.liste_marques = liste_marques
+        self.arg_selected=''
+        self.active = active
+        self.titre = titre
+        self.filtre = filtre
+        self.optionReturn = optionReturn
+        self.fonte_titre=fonte_titre
+        self.init()
+
+    def init(self):        
+        self.make_label_titre()
+        self.make_entry_filtre()
+        self.make_text_box()
+        try:
+            self.entry.component('entry').focus()
+        except:
+            pass
+
+    def make_label_titre(self):
+        """ Crée le label correspondant au titre """
+        if self.titre == '' : return
+        self.label = Label(self.page,
+                           text = self.titre,
+                           font = self.fonte_titre)
+        self.label.pack(side='top',pady=2)
+        
+    def make_entry_filtre(self):
+        """ Crée l'entry permettant à l'utilisateur d'entrer un filtre de sélection dans la liste """
+        if self.filtre != 'oui' : return
+        self.entry = Pmw.EntryField(self.page,labelpos='w',
+                                    label_text="Filtre :",
+                                    command=self.entry_changed)
+        self.entry.pack(side='top',pady=2)
+        
+    def make_text_box(self):
+        """ Crée la fenêtre texte dans laquelle sera affichée la liste """
+        self.MCbox = Text (self.page,relief='sunken',bg='gray95',bd=2)
+        self.MCscroll = Scrollbar (self.page,command = self.MCbox.yview)
+        self.MCscroll.pack(side='right',fill ='y',pady=2)
+        self.MCbox.pack(fill='y',expand=1,padx=2,pady=2)
+        self.MCbox.configure(yscrollcommand=self.MCscroll.set)
+
+
+    def affiche_liste(self):
+        """ Affiche la liste dans la fenêtre"""
+        liste_labels=[]
+        self.MCbox.config(state=NORMAL)
+        self.MCbox.delete(1.0,END)
+        self.nBlabel = 0
+        self.dico_place={}
+        for objet in self.liste :
+          if type(objet) == types.InstanceType:
+              try:
+                  mot = objet.nom
+              except:
+                  mot = str(objet)
+          elif type(objet) in (types.StringType,types.IntType):
+              mot = objet
+          elif type(objet) == types.FloatType :
+              mot = self.parent.get_valeur_texte(objet)
+              if mot == "" :
+                 mot = str(objet)
+          elif type(objet) == types.TupleType :
+              mot="("
+              premier=1
+              for val in objet:
+                 if (not premier):
+                   mot=mot+"," 
+                 else:
+                   premier=0
+                 valtexte = self.parent.get_valeur_texte(val)
+                 if valtexte != "" :
+                    mot=mot+valtexte
+                 else:
+                    mot=mot+str(val)
+              mot=mot+")"
+          else:
+              mot=`objet`
+          label = Label(self.MCbox,
+                        text = mot,
+                        fg = 'black',bg = 'gray95',justify = 'left')
+          self.dico_labels[mot]=label
+          self.dico_place[mot]=self.nBlabel
+         self.dico_mots[label]=mot
+          self.nBlabel=self.nBlabel+1
+          liste_labels.append(label)
+          self.MCbox.window_create(END,
+                                   window=label,
+                                   stretch = 1)
+          self.MCbox.insert(END,'\n')
+          if self.optionReturn != None :
+              label.bind("<Return>",lambda e,s=self,c=self.liste_commandes[2][1],x=objet,l=label : s.chooseitemsurligne(x,l,c))
+              label.bind("<KP_Enter>",lambda e,s=self,c=self.liste_commandes[2][1],x=objet,l=label : s.chooseitemsurligne(x,l,c))
+          label.bind("<Key-Right>",lambda e,s=self,x=objet,l=label : s.selectNextItem(x,l))
+          label.bind("<Key-Down>",lambda e, s=self,x=objet,l=label : s.selectNextItem(x,l))
+          label.bind("<Key-Left>" ,lambda e,s=self,x=objet,l=label  : s.selectPrevItem(x,l))
+          label.bind("<Key-Up>" ,lambda e,s=self,x=objet,l=label  : s.selectPrevItem(x,l))
+          if self.active == 'oui':
+              label.bind(self.liste_commandes[0][0],lambda e,s=self,c=self.liste_commandes[0][1],x=objet,l=label : s.selectitem(x,l,c))
+              label.bind(self.liste_commandes[1][0],lambda e,s=self,c=self.liste_commandes[1][1],x=objet,l=label : s.deselectitem(l,x,c))
+              label.bind(self.liste_commandes[2][0],lambda e,s=self,c=self.liste_commandes[2][1],x=objet,l=label : s.chooseitem(x,l,c))
+
+        for marque in self.liste_marques:
+           try:
+              self.markitem(liste_labels[marque])
+           except:
+              pass
+
+        self.MCbox.config(state=DISABLED)
+        self.selection = None
+        self.dontselect=0
+        for event,callback in self.liste_commandes:
+            if event == "<Enter>":
+               self.selection=None,None,callback
+               break
+
+    def clear_marque(self):
+        try:
+          self.dico_labels[self.arg_selected].configure(bg='gray95',fg='black')
+          self.arg_selected = ''
+        except :
+          pass
+
+    def surligne(self,marque):
+        try :
+           self.highlightitem(self.dico_labels[marque])
+           self.arg_selected = marque
+        except:
+           pass
+
+    def chooseitemsurligne(self,mot,label,commande):
+        """ Active la méthode de choix passée en argument"""
+        try:
+           mot=self.arg_selected
+           commande(mot)
+        except AsException,e:
+           raison=str(e)
+           showerror(raison.split('\n')[0],raison)
+
+    def chooseitem(self,mot,label,commande):
+        """ Active la méthode de choix passée en argument"""
+        try:
+           commande(mot)
+        except AsException,e:
+           raison=str(e)
+           showerror(raison.split('\n')[0],raison)
+
+    def afficheMot(self,mot):
+        """ Pour contourner le bug sur l index 
+            on commence par la methode dite normale     
+            puis par la methode de contournement     
+            puis rien du tout 
+        """
+        try:
+             labelsuivant=self.dico_labels[mot]
+             index = self.MCbox.index(labelsuivant)
+             self.MCbox.see(index)
+        except :
+             posmot=self.dico_place[mot]
+             totale=self.nBlabel + 0.0
+             self.MCbox.yview_moveto(posmot/totale)
+
+    def selectNextItem(self,mot,label):
+        index=self.liste.index(mot)
+        indexsuivant=index+1
+        if indexsuivant > len(self.liste) -1:
+           indexsuivant=0
+        motsuivant=self.liste[indexsuivant]
+        labelsuivant=self.dico_labels[motsuivant]
+        self.afficheMot(motsuivant)
+        self.selectthis(motsuivant,labelsuivant,self.selection[2],)
+        self.dontselect=1
+           
+    def selectPrevItem(self,mot,label):
+        index=self.liste.index(mot)
+        indexprec=index-1
+        motprec=self.liste[indexprec]
+        labelprec=self.dico_labels[motprec]
+        self.afficheMot(motprec)
+        self.selectthis(motprec,labelprec,self.selection[2],)
+        self.dontselect=1
+        
+    def selectthis(self,mot,label,commande) :
+        self.clear_marque()
+        if self.selection != None :
+            self.deselectitem(self.selection[1],self.selection[0],self.selection[2],)
+        self.highlightitem(label)
+        self.selection = (mot,label,commande)
+        self.arg_selected = mot
+        if commande : commande(mot)
+
+    def selectitem(self,mot,label,commande) :
+        """ Met l'item sélectionné (représenté par son label) en surbrillance
+            et lance la commande associée au double-clic"""
+        if self.dontselect:
+           self.dontselect=0
+           return
+        self.selectthis(mot,label,commande)
+
+    def highlightitem(self,label) :
+        """ Met l'item représenté par son label en surbrillance """
+        label.focus_set()
+        label.configure(bg='#00008b',fg='white')
+        
+    def markitem(self,label):
+        """ Met l'item (représenté par son label) en rouge """
+        label.configure(bg='gray95',fg='red')
+        
+    def deselectitem(self,label,mot='',commande=None) :
+        """ Remet l'item (représenté par son label) en noir"""
+        if label:label.configure(bg='gray95',fg='black')
+        self.arg_selected = ''
+        if commande and mot : commande(mot)
+
+    def cherche_selected_item(self):
+        try :
+           index=self.MCbox.index(self.selection[1])
+           lign,col=map(int,string.split(index,'.'))
+        except :
+          label=self.dico_labels[self.arg_selected]
+           mot=self.dico_mots[label] 
+           lign=self.dico_place[mot]+1
+        return lign
+
+    def remove_selected_item(self):
+        try :
+           index=self.MCbox.index(self.selection[1])
+           lign,col=map(int,string.split(index,'.'))
+        except :
+          label=self.dico_labels[self.arg_selected]
+           mot=self.dico_mots[label] 
+           lign=self.dico_place[mot]+1
+        del self.liste[lign-1]
+        self.affiche_liste()
+
+    def entry_changed(self,event=None):
+        """ Cette méthode est invoquée chaque fois que l'utilisateur modifie le contenu
+        de l'entry et frappe <Return>"""
+        if self.arg_selected != '' : self.deselectitem(self.dico_labels[self.arg_selected])
+        filtre = self.entry.get()+"*"
+        FILTRE = string.upper(filtre)
+        self.dontselect=0
+        for arg in self.liste :
+            if fnmatch.fnmatch(arg,filtre) or fnmatch.fnmatch(arg,FILTRE) :
+                label=self.dico_labels[arg]
+                self.afficheMot(arg)
+                self.selectitem(arg,label,self.selection[2])
+                break
+
+        #try :
+          #self.dico_labels[self.arg_selected].focus_set()
+        #except :
+          #pass
+
+
+    # PN attention à la gestion des paramétres
+    # cela retourne H = 1 , et ni H, ni 1
+    #            print repr(val)
+    #            print val.__class__.__name__
+    def get_liste(self):
+        l=[]
+        for val in self.liste:
+#            try:
+#                v = eval(val)
+#                    l.append(v)
+#            except:
+                l.append(val)
+        return l
+    
+    def put_liste(self,liste):
+        self.liste = liste
+        self.affiche_liste()
+
+class Affichage :
+  """ Cette classe permet d'afficher au lancement d'EFICAS le message
+      d'attente et la barre de progression"""
+  def __init__(self,master,message,barre ='oui'):
+      from Tools.foztools.foztools import Slider
+      fonte=fontes.standard12_gras
+      self.master=master
+      self.frame = Frame(self.master)
+      self.frame.pack(expand=1,fill='both')
+      self.mess = Label(self.frame,text=message,justify='center',
+                        bd=2,relief='groove',font=fonte)
+      self.mess.pack(in_ = self.frame,side='top',expand=1,fill='both')
+      self.progress = Slider(self.frame,value=0,max=100,orientation='horizontal',
+                             fillColor='#00008b',width=200,height=30,
+                             background='white',labelColor='red')
+      if barre == 'oui':
+          self.progress.frame.pack(in_=self.frame,side='top')
+      self.master.update()
+      if barre == 'oui':
+          self.progress.frame.after(1000,self.update)
+
+  def configure(self,**options):
+      if options.has_key('message'):
+          self.mess.configure(text=options['message'])
+      if options.has_key('barre'):
+          if options['barre'] == 'oui' :
+              self.progress.frame.pack(in_=self.frame,side='top')
+          elif options['barre'] == 'non' :
+              self.progress.frame.pack_forget()
+      self.master.update_idletasks()
+      
+  def quit(self):
+      self.frame.destroy()
+      self.master.update()
+
+  def update(self,event=None):
+      """ Permet de faire avancer la barre de progression """
+      try :
+          bar=self.progress
+          bar.value = bar.value+self.increment
+          bar.update()
+          self.master.after(100,self.update)
+      except:
+          pass
+
+  def configure_barre(self,nb):
+      """ Calcule l'incrément de progression de la barre en fonction
+          du nombre d'opérations à effectuer afin que le compteur
+          soit à 100% à la fin des opérations"""
+      self.increment = 100./nb
+      self.progress.update()
+
+class Ask_Format_Fichier :
+    """
+    Cette classe permet de créer une fenêtre Toplevel dans laquelle
+    on propose le choix du format de fichier de commandes à ouvrir
+    """
+    def __init__(self,appli):
+        self.fenetre = Toplevel()
+        self.fenetre.configure(width = 250,height=150)
+        self.fenetre.protocol("WM_DELETE_WINDOW", self.quit)
+        self.fenetre.title("Choix du format du fichier de commandes")
+        # définition des frames
+        self.frame_texte = Frame(self.fenetre)
+        self.frame_radioboutons = Frame(self.fenetre)
+        self.frame_bouton_ok = Frame(self.fenetre)
+        self.frame_texte.place(relx=0,rely=0,relwidth=1,relheight=0.3)
+        self.frame_radioboutons.place(relheight=0.5,relx=0,rely=0.3,relwidth=1.)
+        self.frame_bouton_ok.place(relheight=0.2,relx=0,rely=0.8,relwidth=1.)
+        # définition de la zone texte et du scrollbar
+        zone_texte = Label(self.frame_texte,text = "Format du fichier à ouvrir :")
+        zone_texte.pack(side='top',fill='both',expand=1,padx=5,pady=10)
+        # définition des radioboutons
+        Radiobutton(self.frame_radioboutons,text='Format Aster (Code_Aster --> v5)',
+                    variable=appli.format_fichier,value='Aster').pack(anchor='n')
+        Radiobutton(self.frame_radioboutons,text='Format Python (Code_Aster v6-->)',
+                    variable=appli.format_fichier,value='Python').pack(anchor='n')
+        # création du bouton OK
+        Button(self.frame_bouton_ok,text='OK',command=self.quit).pack(anchor='n')
+        # centrage de la fenêtre
+        centerwindow(self.fenetre)
+
+    def quit(self):
+        self.fenetre.destroy()
+
+class BARRE_K2000(Toplevel):
+    def __init__(self,master=None,text = ""):
+        Toplevel.__init__(self,master,relief='groove')
+        self.master.iconify()
+        self.geometry("250x100+0+0")
+        self.protocol("WM_DELETE_WINDOW",self.quit)
+        # frame principale dans self (= Toplevel)
+        self.frame = Frame(self)
+        self.frame.place(relwidth=1,relheight=1)
+        # frame contenant le texte à afficher 
+        self.frame_text = Frame(self.frame)
+        self.frame_text.place(relwidth=1,relheight=0.75,rely=0)
+        # frame contenant le canvas de la barre
+        self.frame_canv = Frame(self.frame)
+        self.frame_canv.place(relwidth=1,relheight=0.25,rely=0.75)
+        # canvas dans lequel sera affichée la barre K2000
+        self.canvas = Canvas(self.frame_canv)
+        self.canvas.place(relx=0.5,rely=0.5,relheight=0.8,relwidth=0.8,anchor='center')
+        # on affiche le texte et la barre
+        self.build_text(text)
+        self.build_batons()
+        #self.overrideredirect(1)
+        # on active la barre ...
+        self.master.after(1000,self.launch)
+        # on centre la fenêtre
+        centerwindow(self)
+        self.focus()
+
+    def build_text(self,text):
+        """
+        Affichage de text dans frame_text
+        """
+        self.texte_var = StringVar()
+        self.texte_var.set(text)
+        Label(self.frame_text,textvariable=self.texte_var).place(relx=0.5,rely=0.5,anchor='center')
+        
+    def build_batons(self):
+        """
+        Construit la suite de bâtons dans le canvas
+        """
+        self.l_batons=[]
+        self.black = -1
+        self.sens = 'D'
+        self.quit = 0
+        for i in range(0,40):
+            id = self.canvas.create_rectangle(i*5,0,(i+1)*5,20,fill='gray90',outline='')
+            self.l_batons.append(id)
+
+    def launch(self):
+        """
+        Active la barre K2000 en affichant les bâtons avec des couleurs en dégradé
+        """
+        if self.quit == 1 :
+            self.destroy()
+            self.master.deiconify()
+            return
+        if self.sens == 'D':
+            self.black = self.black+1
+            l_bat = self.l_batons[0:self.black+1]
+            l_bat.reverse()
+        elif self.sens == 'G':
+            self.black = self.black-1
+            l_bat = self.l_batons[self.black:]
+        i=0
+        for bat in l_bat :
+            num_color = 5+i*10
+            if num_color < 10 : color = 'black'
+            elif num_color > 90 : color = 'white'
+            else: color = 'gray'+`num_color`
+            self.canvas.itemconfigure(bat,fill=color)
+            i=i+1
+        if self.black == len(self.l_batons) :
+            self.sens = 'G'
+        if self.black == 0 and self.sens == 'G':self.sens = 'D'
+        self.after(80,self.launch)
+
+    def update_text(self,new_text):
+        """
+        Remplace le texte affiché par new_text
+        """
+        self.texte_var.set(new_text)
+        
+    def quit(self):
+        self.quit = 1        
+
+class ListeChoixParGroupes(ListeChoix) :
+    """ 
+        Cette classe est utilisée pour afficher une liste de commandes classées par
+        groupes. L'utilisateur peut réaliser des actions de selection
+        qui déclenchent des actions spécifiées par les bindings contenus dans liste_commandes
+        Exemple de binding:
+           liste_commandes = (("<Enter>",self.selectCmd),
+                              ("<Leave>",self.deselectCmd),
+                              ("<Double-Button-1>",self.defCmd))
+        Il s'agit d'une liste de doublets dont le premier element est un evenement et le 
+        deuxieme un callback a appeler sur l'evenement en question.
+
+    """
+    def __init__(self,parent,page,liste_groupes,dict_groupes,liste_commandes=[],liste_marques =[],
+                      active ='oui',filtre='non',titre='',optionReturn=None,fonte_titre=fontes.standard_gras_souligne):
+        self.parent = parent
+        self.page = page
+        self.liste_groupes = liste_groupes
+        self.dict_groupes = dict_groupes
+        self.dico_labels={}
+        self.selection = None
+        self.liste_commandes = liste_commandes
+        self.liste_marques = liste_marques
+        self.arg_selected=''
+        self.active = active
+        self.titre = titre
+        self.filtre = filtre
+        self.optionReturn = optionReturn
+        self.fonte_titre=fonte_titre
+        self.init()
+
+    def affiche_liste(self):
+        """ Affiche la liste dans la fenêtre"""
+        liste_labels=[]
+       self.dico_mots={}
+        self.MCbox.config(state=NORMAL)
+        self.MCbox.delete(1.0,END)
+        for grp in self.liste_groupes:
+           # On itère sur les groupes
+           if grp == "CACHE":continue
+           liste_commandes=self.dict_groupes[grp]
+           text="GROUPE<<<<<<<< "+grp+" "
+           text=text+">"*max(0,30-len(text))
+           label = Label(self.MCbox,
+                        text = text,
+                        fg = 'black',bg = 'gray95',justify = 'left')
+           # On stocke la relation entre le nom de la commande et le label
+           self.dico_labels[grp]=label
+           liste_labels.append(label)
+           self.MCbox.window_create(END,
+                                   window=label,
+                                   stretch = 1)
+           self.MCbox.insert(END,'\n')
+           for cmd in liste_commandes:
+              label = Label(self.MCbox,
+                        text = cmd,
+                        fg = 'black',bg = 'gray95',justify = 'left')
+              # On stocke la relation entre le nom de la commande et le label
+              self.dico_labels[cmd]=label
+             self.dico_mots[label]=cmd
+              self.MCbox.window_create(END,
+                                   window=label,
+                                   stretch = 1)
+              self.MCbox.insert(END,'\n')
+
+              def null(*tp,**args): return
+
+              if self.active == 'oui':
+                  # Traitement par defaut des evenements
+                  label.bind("<Enter>",lambda e,s=self,c=null,x=cmd,l=label: s.selectitem(x,l,c))
+                  label.bind("<Leave>",lambda e,s=self,c=null,x=cmd,l=label: s.deselectitem(l,x,c))
+                  label.bind("<Double-Button-1>",lambda e,s=self,c=null,x=cmd,l=label: s.chooseitem(x,l,c))
+                  label.bind("<Return>",lambda e,s=self,c=null,x=cmd,l=label: s.chooseitem(x,l,c))
+                  label.bind("<KP_Enter>",lambda e,s=self,c=null,x=cmd,l=label: s.chooseitem(x,l,c))
+                  label.bind("<Key-Right>",lambda e,s=self,c=null,x=cmd,l=label,gr=grp: s.selectNextItem(x,l,c,gr,x))
+                  label.bind("<Key-Down>",lambda e,s=self,c=null,x=cmd,l=label,gr=grp: s.selectNextItem(x,l,c,gr,x))
+                  label.bind("<Key-Left>",lambda e,s=self,c=null,x=cmd,l=label,gr=grp: s.selectPrevItem(x,l,c,gr,x))
+                  label.bind("<Key-Up>",lambda e,s=self,c=null,x=cmd,l=label,gr=grp: s.selectPrevItem(x,l,c,gr,x))
+
+                  # Si des callbacks sont definis on les utilise
+                  for event,callback in self.liste_commandes:
+                      if event == "<Enter>":
+                         label.bind("<Enter>",lambda e,s=self,c=callback,x=cmd,l=label: s.selectitem(x,l,c))
+                      elif event == "<Leave>":
+                         label.bind("<Leave>",lambda e,s=self,c=callback,x=cmd,l=label: s.deselectitem(l,x,c))
+                      elif event == "<Double-Button-1>":
+                         label.bind("<Double-Button-1>",lambda e,s=self,c=callback,x=cmd,l=label: s.chooseitem(x,l,c))
+                      elif event == "<Return>":
+                         label.bind("<Return>",lambda e,s=self,c=callback,x=cmd,l=label: s.chooseitem(x,l,c))
+                      elif event == "<KP_Enter>":
+                         label.bind("<KP_Enter>",lambda e,s=self,c=callback,x=cmd,l=label: s.chooseitem(x,l,c))
+                      elif event == "<Key-Right>":
+                         label.bind("<Key-Right>",lambda e,s=self,c=callback,x=cmd,l=label,gr=grp:s.selectNextItem(x,l,c,gr,x))
+                      elif event == "<Key-Down>":
+                         label.bind("<Key-Down>",lambda e,s=self,c=callback,x=cmd,l=label,gr=grp:s.selectNextItem(x,l,c,gr,x))
+                      elif event == "<Key-Left>":
+                         label.bind("<Key-Left>",lambda e,s=self,c=callback,x=cmd,l=label,gr=grp:s.selectPrevItem(x,l,c,gr,x))
+                      elif event == "<Key-Up>":
+                         label.bind("<Key-Up>",lambda e,s=self,c=callback,x=cmd,l=label,gr=grp:s.selectPrevItem(x,l,c,gr,x))
+                      else:
+                         label.bind(event,lambda e,s=self,c=callback,x=cmd,l=label: c())
+
+        for marque in self.liste_marques:
+           try:
+              self.markitem(liste_labels[marque])
+           except:
+              pass
+
+        self.MCbox.config(state=DISABLED)
+        self.selection = None
+        self.dontselect=0
+        for event,callback in self.liste_commandes:
+            if event == "<Enter>":
+               self.selection=None,None,callback
+               break
+
+    def selectPrevItem(self,mot,label,callback,group,cmd):
+        g=self.liste_groupes.index(group)
+        liste_commandes=self.dict_groupes[group]
+        c=liste_commandes.index(cmd)
+        if c > 0:
+           co=liste_commandes[c-1]
+        else:
+           # debut de liste. On passe au groupe precedent
+           if g > 0:
+              gr=self.liste_groupes[g-1]
+              co=self.dict_groupes[gr][-1]
+           else:
+              # debut des groupes. On ne fait rien
+              return
+        # On a trouve l'item precedent
+        labelsuivant=self.dico_labels[co]
+        index = self.MCbox.index(labelsuivant)
+        self.MCbox.see(index)
+        self.selectthis(co,labelsuivant,self.selection[2],)
+        self.dontselect=1
+
+    def selectNextItem(self,mot,label,callback,group,cmd):
+        g=self.liste_groupes.index(group)
+        liste_commandes=self.dict_groupes[group]
+        c=liste_commandes.index(cmd)
+        try:
+           co=liste_commandes[c+1]
+        except:
+           # fin de liste. On passe au groupe suivant
+           try:
+              gr=self.liste_groupes[g+1]
+              co=self.dict_groupes[gr][0]
+           except:
+              # fin des groupes. On ne fait rien
+              return
+        # On a trouve l'item suivant
+        labelsuivant=self.dico_labels[co]
+        index = self.MCbox.index(labelsuivant)
+        self.MCbox.see(index)
+        self.selectthis(co,labelsuivant,self.selection[2],)
+        self.dontselect=1
+
+    def entry_changed(self,event=None):
+        """ 
+            Cette méthode est invoquée chaque fois que l'utilisateur modifie le contenu
+            de l'entry et frappe <Return>
+        """
+        if self.arg_selected != '' : self.deselectitem(self.dico_labels[self.arg_selected])
+
+        filtre = self.entry.get()+"*"
+        FILTRE = string.upper(filtre)
+        #
+        # On cherche d'abord dans les noms de groupe
+        # puis dans les noms de commande groupe par groupe
+        #
+        for grp in self.liste_groupes:
+            if fnmatch.fnmatch(grp,filtre) or fnmatch.fnmatch(grp,FILTRE) :
+                cmd=self.dict_groupes[grp][0]
+                label=self.dico_labels[cmd]
+                index = self.MCbox.index(label)
+                self.MCbox.see(index)
+                self.selectitem(cmd,label,self.selection[2])
+                # On a trouve un groupe on arrete la recherche
+                return
+
+        for grp in self.liste_groupes:
+           for cmd in self.dict_groupes[grp] :
+              if fnmatch.fnmatch(cmd,filtre) or fnmatch.fnmatch(cmd,FILTRE) :
+                 label=self.dico_labels[cmd]
+                 index = self.MCbox.index(label)
+                 self.MCbox.see(index)
+                 self.selectitem(cmd,label,self.selection[2])
+                 # On a trouve une commande  on arrete la recherche
+                 return
+
diff --git a/Ui/desChoixCata.py b/Ui/desChoixCata.py
new file mode 100644 (file)
index 0000000..8446d25
--- /dev/null
@@ -0,0 +1,79 @@
+# -*- coding: utf-8 -*-
+
+# Form implementation generated from reading ui file 'desChoixCata.ui'
+#
+# Created: mer mai 23 10:40:48 2007
+#      by: The PyQt User Interface Compiler (pyuic) 3.13
+#
+# WARNING! All changes made in this file will be lost!
+
+
+from qt import *
+
+
+class DChoixCata(QDialog):
+    def __init__(self,parent = None,name = None,modal = 0,fl = 0):
+        QDialog.__init__(self,parent,name,modal,fl)
+
+        if not name:
+            self.setName("DChoixCata")
+
+        self.setSizeGripEnabled(1)
+
+
+        self.frame3 = QFrame(self,"frame3")
+        self.frame3.setGeometry(QRect(0,120,540,50))
+        self.frame3.setFrameShape(QFrame.StyledPanel)
+        self.frame3.setFrameShadow(QFrame.Raised)
+
+        self.buttonCancel = QPushButton(self.frame3,"buttonCancel")
+        self.buttonCancel.setGeometry(QRect(370,10,90,30))
+        self.buttonCancel.setAutoDefault(1)
+
+        self.buttonOk = QPushButton(self.frame3,"buttonOk")
+        self.buttonOk.setGeometry(QRect(80,10,90,30))
+        self.buttonOk.setAutoDefault(1)
+        self.buttonOk.setDefault(1)
+
+        self.textLabel1_2 = QLabel(self,"textLabel1_2")
+        self.textLabel1_2.setGeometry(QRect(40,50,340,20))
+
+        self.CBChoixCata = QComboBox(0,self,"CBChoixCata")
+        self.CBChoixCata.setEnabled(1)
+        self.CBChoixCata.setGeometry(QRect(400,41,101,30))
+
+        self.TLNb = QLabel(self,"TLNb")
+        self.TLNb.setGeometry(QRect(110,30,210,20))
+        self.TLNb.setMinimumSize(QSize(30,0))
+
+        self.languageChange()
+
+        self.resize(QSize(547,172).expandedTo(self.minimumSizeHint()))
+        self.clearWState(Qt.WState_Polished)
+
+        self.connect(self.buttonOk,SIGNAL("clicked()"),self.BOkPressed)
+        self.connect(self.buttonCancel,SIGNAL("clicked()"),self.BCancelPressed)
+        self.connect(self.CBChoixCata,SIGNAL("textChanged(const QString&)"),self.CataChoisi)
+
+
+    def languageChange(self):
+        self.setCaption(self.__tr("Choix d'une version du code Aster"))
+        self.buttonCancel.setText(self.__tr("&Cancel"))
+        self.buttonCancel.setAccel(QString.null)
+        self.buttonOk.setText(self.__tr("&OK"))
+        self.buttonOk.setAccel(QString.null)
+        self.textLabel1_2.setText(self.__tr("<font size=\"+1\">Veuillez choisir celle avec laquelle vous souhaitez travailler</font>"))
+        self.TLNb.setText(self.__tr("2"))
+
+
+    def CataChoisi(self):
+        print "DChoixCata.CataChoisi(): Not implemented yet"
+
+    def BOkPressed(self):
+        print "DChoixCata.BOkPressed(): Not implemented yet"
+
+    def BCancelPressed(self):
+        print "DChoixCata.BCancelPressed(): Not implemented yet"
+
+    def __tr(self,s,c = None):
+        return qApp.translate("DChoixCata",s,c)
diff --git a/Ui/desChoixCata.ui b/Ui/desChoixCata.ui
new file mode 100644 (file)
index 0000000..6629779
--- /dev/null
@@ -0,0 +1,168 @@
+<!DOCTYPE UI><UI version="3.3" stdsetdef="1">
+<class>DChoixCata</class>
+<widget class="QDialog">
+    <property name="name">
+        <cstring>DChoixCata</cstring>
+    </property>
+    <property name="geometry">
+        <rect>
+            <x>0</x>
+            <y>0</y>
+            <width>547</width>
+            <height>172</height>
+        </rect>
+    </property>
+    <property name="caption">
+        <string>Choix d'une version du code Aster</string>
+    </property>
+    <property name="sizeGripEnabled">
+        <bool>true</bool>
+    </property>
+    <widget class="QFrame">
+        <property name="name">
+            <cstring>frame3</cstring>
+        </property>
+        <property name="geometry">
+            <rect>
+                <x>0</x>
+                <y>120</y>
+                <width>540</width>
+                <height>50</height>
+            </rect>
+        </property>
+        <property name="frameShape">
+            <enum>StyledPanel</enum>
+        </property>
+        <property name="frameShadow">
+            <enum>Raised</enum>
+        </property>
+        <widget class="QPushButton">
+            <property name="name">
+                <cstring>buttonCancel</cstring>
+            </property>
+            <property name="geometry">
+                <rect>
+                    <x>370</x>
+                    <y>10</y>
+                    <width>90</width>
+                    <height>30</height>
+                </rect>
+            </property>
+            <property name="text">
+                <string>&amp;Cancel</string>
+            </property>
+            <property name="accel">
+                <string></string>
+            </property>
+            <property name="autoDefault">
+                <bool>true</bool>
+            </property>
+        </widget>
+        <widget class="QPushButton">
+            <property name="name">
+                <cstring>buttonOk</cstring>
+            </property>
+            <property name="geometry">
+                <rect>
+                    <x>80</x>
+                    <y>10</y>
+                    <width>90</width>
+                    <height>30</height>
+                </rect>
+            </property>
+            <property name="text">
+                <string>&amp;OK</string>
+            </property>
+            <property name="accel">
+                <string></string>
+            </property>
+            <property name="autoDefault">
+                <bool>true</bool>
+            </property>
+            <property name="default">
+                <bool>true</bool>
+            </property>
+        </widget>
+    </widget>
+    <widget class="QLabel">
+        <property name="name">
+            <cstring>textLabel1_2</cstring>
+        </property>
+        <property name="geometry">
+            <rect>
+                <x>40</x>
+                <y>50</y>
+                <width>340</width>
+                <height>20</height>
+            </rect>
+        </property>
+        <property name="text">
+            <string>&lt;font size="+1"&gt;Veuillez choisir celle avec laquelle vous souhaitez travailler&lt;/font&gt;</string>
+        </property>
+    </widget>
+    <widget class="QComboBox">
+        <property name="name">
+            <cstring>CBChoixCata</cstring>
+        </property>
+        <property name="enabled">
+            <bool>true</bool>
+        </property>
+        <property name="geometry">
+            <rect>
+                <x>400</x>
+                <y>41</y>
+                <width>101</width>
+                <height>30</height>
+            </rect>
+        </property>
+    </widget>
+    <widget class="QLabel">
+        <property name="name">
+            <cstring>TLNb</cstring>
+        </property>
+        <property name="geometry">
+            <rect>
+                <x>110</x>
+                <y>30</y>
+                <width>210</width>
+                <height>20</height>
+            </rect>
+        </property>
+        <property name="minimumSize">
+            <size>
+                <width>30</width>
+                <height>0</height>
+            </size>
+        </property>
+        <property name="text">
+            <string>2</string>
+        </property>
+    </widget>
+</widget>
+<connections>
+    <connection>
+        <sender>buttonOk</sender>
+        <signal>clicked()</signal>
+        <receiver>DChoixCata</receiver>
+        <slot>BOkPressed()</slot>
+    </connection>
+    <connection>
+        <sender>buttonCancel</sender>
+        <signal>clicked()</signal>
+        <receiver>DChoixCata</receiver>
+        <slot>BCancelPressed()</slot>
+    </connection>
+    <connection>
+        <sender>CBChoixCata</sender>
+        <signal>textChanged(const QString&amp;)</signal>
+        <receiver>DChoixCata</receiver>
+        <slot>CataChoisi()</slot>
+    </connection>
+</connections>
+<slots>
+    <slot>CataChoisi()</slot>
+    <slot>BOkPressed()</slot>
+    <slot>BCancelPressed()</slot>
+</slots>
+<layoutdefaults spacing="6" margin="11"/>
+</UI>
diff --git a/Ui/desCommande.py b/Ui/desCommande.py
new file mode 100644 (file)
index 0000000..9ae67ec
--- /dev/null
@@ -0,0 +1,220 @@
+# -*- coding: utf-8 -*-
+
+# Form implementation generated from reading ui file 'desCommande.ui'
+#
+# Created: jeu avr 26 14:25:01 2007
+#      by: The PyQt User Interface Compiler (pyuic) 3.13
+#
+# WARNING! All changes made in this file will be lost!
+
+
+from qt import *
+
+image0_data = \
+    "\x89\x50\x4e\x47\x0d\x0a\x1a\x0a\x00\x00\x00\x0d" \
+    "\x49\x48\x44\x52\x00\x00\x00\x21\x00\x00\x00\x0e" \
+    "\x08\x06\x00\x00\x00\xa1\x1e\x75\x8c\x00\x00\x00" \
+    "\xcf\x49\x44\x41\x54\x38\x8d\xd5\x94\xdb\x0e\xc3" \
+    "\x20\x0c\x43\xed\xfd\xf8\xd8\x97\xbb\x0f\x34\x5b" \
+    "\x48\x08\x45\xd5\x1e\xb6\x48\x88\xf4\x12\xe7\x60" \
+    "\x01\xc0\x0f\x04\x6f\xd6\xe9\x9b\xba\x77\x20\x04" \
+    "\x80\x92\x4a\x10\x32\xc9\x2e\xfb\xd8\xc7\xd5\xca" \
+    "\xbc\xc0\x25\x40\x00\x99\xe9\x57\x84\x95\x68\xfe" \
+    "\x7f\x06\xc0\xde\xd1\xde\xb3\x2b\x4a\x1e\xc4\xea" \
+    "\x82\x4b\x9e\x74\x09\x71\x65\xbd\x01\xf8\x55\x27" \
+    "\xf7\x8a\x72\x01\xe0\xa3\x12\x9f\x34\x5a\x01\x7c" \
+    "\x54\x3b\xaf\xdc\x98\x3d\x0f\x71\x09\xd1\x5a\x33" \
+    "\x1b\x47\x1f\x47\x07\x2c\x17\x49\x4a\x82\x33\x8f" \
+    "\x61\x78\x20\x3a\x88\x17\xe6\x73\x06\xb1\xf0\x8b" \
+    "\x07\xba\x03\xe6\x02\xc9\xb8\x31\x07\x7e\x37\xe0" \
+    "\x20\x9e\x67\xe3\x38\x67\x10\x97\x7b\x17\xde\x80" \
+    "\xc1\x85\xad\x38\x69\x5a\x51\xd5\x22\xc8\x2c\xe7" \
+    "\x79\x12\xe2\xfe\xd8\xbe\x83\x76\x20\x92\xf5\x2b" \
+    "\x18\x20\xdd\x11\xbb\x10\xe5\x65\xb5\x3a\x5a\x3b" \
+    "\xba\xff\x13\x07\x13\xd6\x6f\xa6\x98\x18\x57\x06" \
+    "\x00\x00\x00\x00\x49\x45\x4e\x44\xae\x42\x60\x82"
+
+class DComm(QWidget):
+    def __init__(self,parent = None,name = None,fl = 0):
+        QWidget.__init__(self,parent,name,fl)
+
+        self.image0 = QPixmap()
+        self.image0.loadFromData(image0_data,"PNG")
+        if not name:
+            self.setName("DComm")
+
+        self.setMinimumSize(QSize(505,0))
+
+
+        self.Commentaire = QLabel(self,"Commentaire")
+        self.Commentaire.setGeometry(QRect(10,410,490,20))
+        self.Commentaire.setFrameShape(QLabel.NoFrame)
+        self.Commentaire.setFrameShadow(QLabel.Plain)
+
+        self.bSup = QPushButton(self,"bSup")
+        self.bSup.setGeometry(QRect(320,440,142,30))
+        self.bSup.setAutoDefault(1)
+
+        self.bOk = QPushButton(self,"bOk")
+        self.bOk.setGeometry(QRect(170,440,142,30))
+        self.bOk.setAutoDefault(1)
+        self.bOk.setDefault(1)
+
+        self.bHelp = QPushButton(self,"bHelp")
+        self.bHelp.setGeometry(QRect(10,440,142,30))
+        self.bHelp.setAutoDefault(1)
+
+        self.TWChoix = QTabWidget(self,"TWChoix")
+        self.TWChoix.setGeometry(QRect(0,0,500,400))
+
+        self.MotClef = QWidget(self.TWChoix,"MotClef")
+
+        self.LBMCPermis = QListBox(self.MotClef,"LBMCPermis")
+        self.LBMCPermis.setGeometry(QRect(10,40,220,290))
+        self.LBMCPermis.setMinimumSize(QSize(0,0))
+
+        self.LBRegles = QListBox(self.MotClef,"LBRegles")
+        self.LBRegles.setGeometry(QRect(260,40,230,290))
+
+        self.textLabel1 = QLabel(self.MotClef,"textLabel1")
+        self.textLabel1.setGeometry(QRect(50,10,140,20))
+        self.textLabel1.setMinimumSize(QSize(0,0))
+
+        self.textLabel1_2 = QLabel(self.MotClef,"textLabel1_2")
+        self.textLabel1_2.setGeometry(QRect(360,0,50,37))
+        self.TWChoix.insertTab(self.MotClef,QString(""))
+
+        self.Concept = QWidget(self.TWChoix,"Concept")
+
+        self.groupBox1 = QGroupBox(self.Concept,"groupBox1")
+        self.groupBox1.setGeometry(QRect(0,10,520,380))
+
+        self.textLabel1_3 = QLabel(self.groupBox1,"textLabel1_3")
+        self.textLabel1_3.setGeometry(QRect(80,50,82,31))
+
+        self.textLabel1_3_2 = QLabel(self.groupBox1,"textLabel1_3_2")
+        self.textLabel1_3_2.setGeometry(QRect(80,170,82,31))
+
+        self.textLabel3 = QLabel(self.groupBox1,"textLabel3")
+        self.textLabel3.setGeometry(QRect(80,200,230,31))
+
+        self.LENomConcept = QLineEdit(self.groupBox1,"LENomConcept")
+        self.LENomConcept.setGeometry(QRect(80,110,310,30))
+
+        self.typeConcept = QLabel(self.groupBox1,"typeConcept")
+        self.typeConcept.setGeometry(QRect(320,200,100,31))
+        self.TWChoix.insertTab(self.Concept,QString(""))
+
+        self.Commande = QWidget(self.TWChoix,"Commande")
+
+        self.textLabel6 = QLabel(self.Commande,"textLabel6")
+        self.textLabel6.setGeometry(QRect(10,60,60,30))
+
+        self.textLabel4 = QLabel(self.Commande,"textLabel4")
+        self.textLabel4.setGeometry(QRect(90,340,300,30))
+
+        self.LBNouvCommande = QListBox(self.Commande,"LBNouvCommande")
+        self.LBNouvCommande.setGeometry(QRect(50,100,410,240))
+
+        self.buttonGroup1 = QButtonGroup(self.Commande,"buttonGroup1")
+        self.buttonGroup1.setGeometry(QRect(298,17,151,70))
+
+        self.RBGroupe = QRadioButton(self.buttonGroup1,"RBGroupe")
+        self.RBGroupe.setGeometry(QRect(20,40,101,20))
+
+        self.RBalpha = QRadioButton(self.buttonGroup1,"RBalpha")
+        self.RBalpha.setGeometry(QRect(20,20,101,20))
+        self.RBalpha.setChecked(1)
+
+        self.LEFiltre = QLineEdit(self.Commande,"LEFiltre")
+        self.LEFiltre.setGeometry(QRect(50,60,160,30))
+
+        self.BNext = QToolButton(self.Commande,"BNext")
+        self.BNext.setGeometry(QRect(220,60,30,31))
+        self.BNext.setIconSet(QIconSet(self.image0))
+
+        self.textLabel1_4 = QLabel(self.Commande,"textLabel1_4")
+        self.textLabel1_4.setGeometry(QRect(50,20,171,21))
+        self.TWChoix.insertTab(self.Commande,QString(""))
+
+        self.languageChange()
+
+        self.resize(QSize(505,483).expandedTo(self.minimumSizeHint()))
+        self.clearWState(Qt.WState_Polished)
+
+        self.connect(self.LBNouvCommande,SIGNAL("clicked(QListBoxItem*)"),self.LBNouvCommandeClicked)
+        self.connect(self.LEFiltre,SIGNAL("textChanged(const QString&)"),self.LEFiltreTextChanged)
+        self.connect(self.LEFiltre,SIGNAL("returnPressed()"),self.LEfiltreReturnPressed)
+        self.connect(self.bSup,SIGNAL("pressed()"),self.BSupPressed)
+        self.connect(self.bOk,SIGNAL("clicked()"),self.BOkPressed)
+        self.connect(self.LENomConcept,SIGNAL("returnPressed()"),self.LENomConceptReturnPressed)
+        self.connect(self.RBGroupe,SIGNAL("clicked()"),self.BuildTabCommand)
+        self.connect(self.RBalpha,SIGNAL("clicked()"),self.BuildTabCommand)
+        self.connect(self.bHelp,SIGNAL("clicked()"),self.BHelpPressed)
+        self.connect(self.BNext,SIGNAL("pressed()"),self.BNextPressed)
+
+
+    def languageChange(self):
+        self.setCaption(self.__tr("DComm"))
+        self.Commentaire.setText(QString.null)
+        self.bSup.setText(self.__tr("&Supprimer"))
+        self.bSup.setAccel(self.__tr("Alt+S"))
+        QToolTip.add(self.bSup,self.__tr("suppression du mot clef"))
+        self.bOk.setText(self.__tr("&Valider"))
+        self.bOk.setAccel(self.__tr("Shift+A, Alt+A, Alt+A, Alt+A"))
+        QToolTip.add(self.bOk,self.__tr("validation de la saisie"))
+        self.bHelp.setText(self.__tr("&Documentation"))
+        self.bHelp.setAccel(self.__tr("Alt+D"))
+        QToolTip.add(self.bHelp,self.__tr("affichage documentation aster"))
+        self.textLabel1.setText(self.__tr("<h3><p align=\"center\"><u><b>Mots Clefs Permis</b></u></p></h3>"))
+        self.textLabel1_2.setText(self.__trUtf8("\x3c\x68\x33\x3e\x3c\x70\x20\x61\x6c\x69\x67\x6e\x3d\x22\x63\x65\x6e\x74\x65\x72\x22\x3e\x3c\x75\x3e\x3c\x62\x3e\x52\xc3\xa8\x67\x6c\x65\x73\x3c\x2f\x62\x3e\x3c\x2f\x75\x3e\x3c\x2f\x70\x3e\x3c\x2f\x68\x33\x3e"))
+        self.TWChoix.changeTab(self.MotClef,self.__tr("Ajouter Mot-Clef"))
+        self.groupBox1.setTitle(self.__tr("Concept"))
+        self.textLabel1_3.setText(self.__tr("<u>Nom du concept :</u>"))
+        self.textLabel1_3_2.setText(self.__tr("<u>Type du concept :</u>"))
+        self.textLabel3.setText(self.__trUtf8("\x4c\x27\x6f\x70\xc3\xa9\x72\x61\x74\x65\x75\x72\x20\x63\x6f\x75\x72\x61\x6e\x74\x20\x72\x65\x74\x6f\x75\x72\x6e\x65\x20\x75\x6e\x20\x63\x6f\x6e\x63\x65\x70\x74\x20\x64\x65\x20\x74\x79\x70\x65\x20\x3a"))
+        self.typeConcept.setText(self.__tr("TypeDuConcept"))
+        self.TWChoix.changeTab(self.Concept,self.__tr("Nommer Concept"))
+        self.textLabel6.setText(self.__tr("Filtre"))
+        self.textLabel4.setText(self.__trUtf8("\x4c\x61\x20\x63\x6f\x6d\x6d\x61\x6e\x64\x65\x20\x63\x68\x6f\x69\x73\x69\x65\x20\x73\x65\x72\x61\x20\x61\x6a\x6f\x75\x74\xc3\xa9\x65\x20\x41\x50\x52\x45\x53\x20\x6c\x61\x20\x63\x6f\x6d\x6d\x61\x6e\x64\x65\x20\x63\x6f\x75\x72\x61\x6e\x74\x65"))
+        self.buttonGroup1.setTitle(self.__tr("Affichage"))
+        self.RBGroupe.setText(self.__tr("par groupe"))
+        self.RBalpha.setText(self.__trUtf8("\x61\x6c\x70\x68\x61\x62\xc3\xa9\x74\x69\x71\x75\x65"))
+        self.BNext.setText(QString.null)
+        QToolTip.add(self.BNext,self.__tr("affiche la prochaine occurence"))
+        self.textLabel1_4.setText(self.__tr("<b><u>Commandes :</u></b>"))
+        self.TWChoix.changeTab(self.Commande,self.__tr("Nouvelle Commande"))
+
+
+    def LBNouvCommandeClicked(self):
+        print "DComm.LBNouvCommandeClicked(): Not implemented yet"
+
+    def LEFiltreTextChanged(self):
+        print "DComm.LEFiltreTextChanged(): Not implemented yet"
+
+    def LEfiltreReturnPressed(self):
+        print "DComm.LEfiltreReturnPressed(): Not implemented yet"
+
+    def BSupPressed(self):
+        print "DComm.BSupPressed(): Not implemented yet"
+
+    def LENomConceptReturnPressed(self):
+        print "DComm.LENomConceptReturnPressed(): Not implemented yet"
+
+    def BOkPressed(self):
+        print "DComm.BOkPressed(): Not implemented yet"
+
+    def BuildTabCommand(self):
+        print "DComm.BuildTabCommand(): Not implemented yet"
+
+    def BHelpPressed(self):
+        print "DComm.BHelpPressed(): Not implemented yet"
+
+    def BNextPressed(self):
+        print "DComm.BNextPressed(): Not implemented yet"
+
+    def __tr(self,s,c = None):
+        return qApp.translate("DComm",s,c)
+
+    def __trUtf8(self,s,c = None):
+        return qApp.translate("DComm",s,c,QApplication.UnicodeUTF8)
diff --git a/Ui/desCommande.ui b/Ui/desCommande.ui
new file mode 100644 (file)
index 0000000..e8d3037
--- /dev/null
@@ -0,0 +1,551 @@
+<!DOCTYPE UI><UI version="3.3" stdsetdef="1">
+<class>DComm</class>
+<widget class="QWidget">
+    <property name="name">
+        <cstring>DComm</cstring>
+    </property>
+    <property name="geometry">
+        <rect>
+            <x>0</x>
+            <y>0</y>
+            <width>505</width>
+            <height>483</height>
+        </rect>
+    </property>
+    <property name="minimumSize">
+        <size>
+            <width>505</width>
+            <height>0</height>
+        </size>
+    </property>
+    <property name="caption">
+        <string>DComm</string>
+    </property>
+    <widget class="QLabel">
+        <property name="name">
+            <cstring>Commentaire</cstring>
+        </property>
+        <property name="geometry">
+            <rect>
+                <x>10</x>
+                <y>410</y>
+                <width>490</width>
+                <height>20</height>
+            </rect>
+        </property>
+        <property name="frameShape">
+            <enum>NoFrame</enum>
+        </property>
+        <property name="frameShadow">
+            <enum>Plain</enum>
+        </property>
+        <property name="text">
+            <string></string>
+        </property>
+    </widget>
+    <widget class="QPushButton">
+        <property name="name">
+            <cstring>bSup</cstring>
+        </property>
+        <property name="geometry">
+            <rect>
+                <x>320</x>
+                <y>440</y>
+                <width>142</width>
+                <height>30</height>
+            </rect>
+        </property>
+        <property name="text">
+            <string>&amp;Supprimer</string>
+        </property>
+        <property name="accel">
+            <string>Alt+S</string>
+        </property>
+        <property name="autoDefault">
+            <bool>true</bool>
+        </property>
+        <property name="toolTip" stdset="0">
+            <string>suppression du mot clef</string>
+        </property>
+    </widget>
+    <widget class="QPushButton">
+        <property name="name">
+            <cstring>bOk</cstring>
+        </property>
+        <property name="geometry">
+            <rect>
+                <x>170</x>
+                <y>440</y>
+                <width>142</width>
+                <height>30</height>
+            </rect>
+        </property>
+        <property name="text">
+            <string>&amp;Valider</string>
+        </property>
+        <property name="accel">
+            <string>Shift+A, Alt+A, Alt+A, Alt+A</string>
+        </property>
+        <property name="autoDefault">
+            <bool>true</bool>
+        </property>
+        <property name="default">
+            <bool>true</bool>
+        </property>
+        <property name="toolTip" stdset="0">
+            <string>validation de la saisie</string>
+        </property>
+    </widget>
+    <widget class="QPushButton">
+        <property name="name">
+            <cstring>bHelp</cstring>
+        </property>
+        <property name="geometry">
+            <rect>
+                <x>10</x>
+                <y>440</y>
+                <width>142</width>
+                <height>30</height>
+            </rect>
+        </property>
+        <property name="text">
+            <string>&amp;Documentation</string>
+        </property>
+        <property name="accel">
+            <string>Alt+D</string>
+        </property>
+        <property name="autoDefault">
+            <bool>true</bool>
+        </property>
+        <property name="toolTip" stdset="0">
+            <string>affichage documentation aster</string>
+        </property>
+    </widget>
+    <widget class="QTabWidget">
+        <property name="name">
+            <cstring>TWChoix</cstring>
+        </property>
+        <property name="geometry">
+            <rect>
+                <x>0</x>
+                <y>0</y>
+                <width>500</width>
+                <height>400</height>
+            </rect>
+        </property>
+        <widget class="QWidget">
+            <property name="name">
+                <cstring>MotClef</cstring>
+            </property>
+            <attribute name="title">
+                <string>Ajouter Mot-Clef</string>
+            </attribute>
+            <widget class="QListBox">
+                <property name="name">
+                    <cstring>LBMCPermis</cstring>
+                </property>
+                <property name="geometry">
+                    <rect>
+                        <x>10</x>
+                        <y>40</y>
+                        <width>220</width>
+                        <height>290</height>
+                    </rect>
+                </property>
+                <property name="minimumSize">
+                    <size>
+                        <width>0</width>
+                        <height>0</height>
+                    </size>
+                </property>
+            </widget>
+            <widget class="QListBox">
+                <property name="name">
+                    <cstring>LBRegles</cstring>
+                </property>
+                <property name="geometry">
+                    <rect>
+                        <x>260</x>
+                        <y>40</y>
+                        <width>230</width>
+                        <height>290</height>
+                    </rect>
+                </property>
+            </widget>
+            <widget class="QLabel">
+                <property name="name">
+                    <cstring>textLabel1</cstring>
+                </property>
+                <property name="geometry">
+                    <rect>
+                        <x>50</x>
+                        <y>10</y>
+                        <width>140</width>
+                        <height>20</height>
+                    </rect>
+                </property>
+                <property name="minimumSize">
+                    <size>
+                        <width>0</width>
+                        <height>0</height>
+                    </size>
+                </property>
+                <property name="text">
+                    <string>&lt;h3&gt;&lt;p align="center"&gt;&lt;u&gt;&lt;b&gt;Mots Clefs Permis&lt;/b&gt;&lt;/u&gt;&lt;/p&gt;&lt;/h3&gt;</string>
+                </property>
+            </widget>
+            <widget class="QLabel">
+                <property name="name">
+                    <cstring>textLabel1_2</cstring>
+                </property>
+                <property name="geometry">
+                    <rect>
+                        <x>360</x>
+                        <y>0</y>
+                        <width>50</width>
+                        <height>37</height>
+                    </rect>
+                </property>
+                <property name="text">
+                    <string>&lt;h3&gt;&lt;p align="center"&gt;&lt;u&gt;&lt;b&gt;Règles&lt;/b&gt;&lt;/u&gt;&lt;/p&gt;&lt;/h3&gt;</string>
+                </property>
+            </widget>
+        </widget>
+        <widget class="QWidget">
+            <property name="name">
+                <cstring>Concept</cstring>
+            </property>
+            <attribute name="title">
+                <string>Nommer Concept</string>
+            </attribute>
+            <widget class="QGroupBox">
+                <property name="name">
+                    <cstring>groupBox1</cstring>
+                </property>
+                <property name="geometry">
+                    <rect>
+                        <x>0</x>
+                        <y>10</y>
+                        <width>520</width>
+                        <height>380</height>
+                    </rect>
+                </property>
+                <property name="title">
+                    <string>Concept</string>
+                </property>
+                <widget class="QLabel">
+                    <property name="name">
+                        <cstring>textLabel1_3</cstring>
+                    </property>
+                    <property name="geometry">
+                        <rect>
+                            <x>80</x>
+                            <y>50</y>
+                            <width>82</width>
+                            <height>31</height>
+                        </rect>
+                    </property>
+                    <property name="text">
+                        <string>&lt;u&gt;Nom du concept :&lt;/u&gt;</string>
+                    </property>
+                </widget>
+                <widget class="QLabel">
+                    <property name="name">
+                        <cstring>textLabel1_3_2</cstring>
+                    </property>
+                    <property name="geometry">
+                        <rect>
+                            <x>80</x>
+                            <y>170</y>
+                            <width>82</width>
+                            <height>31</height>
+                        </rect>
+                    </property>
+                    <property name="text">
+                        <string>&lt;u&gt;Type du concept :&lt;/u&gt;</string>
+                    </property>
+                </widget>
+                <widget class="QLabel">
+                    <property name="name">
+                        <cstring>textLabel3</cstring>
+                    </property>
+                    <property name="geometry">
+                        <rect>
+                            <x>80</x>
+                            <y>200</y>
+                            <width>230</width>
+                            <height>31</height>
+                        </rect>
+                    </property>
+                    <property name="text">
+                        <string>L'opérateur courant retourne un concept de type :</string>
+                    </property>
+                </widget>
+                <widget class="QLineEdit">
+                    <property name="name">
+                        <cstring>LENomConcept</cstring>
+                    </property>
+                    <property name="geometry">
+                        <rect>
+                            <x>80</x>
+                            <y>110</y>
+                            <width>310</width>
+                            <height>30</height>
+                        </rect>
+                    </property>
+                </widget>
+                <widget class="QLabel">
+                    <property name="name">
+                        <cstring>typeConcept</cstring>
+                    </property>
+                    <property name="geometry">
+                        <rect>
+                            <x>320</x>
+                            <y>200</y>
+                            <width>100</width>
+                            <height>31</height>
+                        </rect>
+                    </property>
+                    <property name="text">
+                        <string>TypeDuConcept</string>
+                    </property>
+                </widget>
+            </widget>
+        </widget>
+        <widget class="QWidget">
+            <property name="name">
+                <cstring>Commande</cstring>
+            </property>
+            <attribute name="title">
+                <string>Nouvelle Commande</string>
+            </attribute>
+            <widget class="QLabel">
+                <property name="name">
+                    <cstring>textLabel6</cstring>
+                </property>
+                <property name="geometry">
+                    <rect>
+                        <x>10</x>
+                        <y>60</y>
+                        <width>60</width>
+                        <height>30</height>
+                    </rect>
+                </property>
+                <property name="text">
+                    <string>Filtre</string>
+                </property>
+            </widget>
+            <widget class="QLabel">
+                <property name="name">
+                    <cstring>textLabel4</cstring>
+                </property>
+                <property name="geometry">
+                    <rect>
+                        <x>90</x>
+                        <y>340</y>
+                        <width>300</width>
+                        <height>30</height>
+                    </rect>
+                </property>
+                <property name="text">
+                    <string>La commande choisie sera ajoutée APRES la commande courante</string>
+                </property>
+            </widget>
+            <widget class="QListBox">
+                <property name="name">
+                    <cstring>LBNouvCommande</cstring>
+                </property>
+                <property name="geometry">
+                    <rect>
+                        <x>50</x>
+                        <y>100</y>
+                        <width>410</width>
+                        <height>240</height>
+                    </rect>
+                </property>
+            </widget>
+            <widget class="QButtonGroup">
+                <property name="name">
+                    <cstring>buttonGroup1</cstring>
+                </property>
+                <property name="geometry">
+                    <rect>
+                        <x>298</x>
+                        <y>17</y>
+                        <width>151</width>
+                        <height>70</height>
+                    </rect>
+                </property>
+                <property name="title">
+                    <string>Affichage</string>
+                </property>
+                <widget class="QRadioButton">
+                    <property name="name">
+                        <cstring>RBGroupe</cstring>
+                    </property>
+                    <property name="geometry">
+                        <rect>
+                            <x>20</x>
+                            <y>40</y>
+                            <width>101</width>
+                            <height>20</height>
+                        </rect>
+                    </property>
+                    <property name="text">
+                        <string>par groupe</string>
+                    </property>
+                </widget>
+                <widget class="QRadioButton">
+                    <property name="name">
+                        <cstring>RBalpha</cstring>
+                    </property>
+                    <property name="geometry">
+                        <rect>
+                            <x>20</x>
+                            <y>20</y>
+                            <width>101</width>
+                            <height>20</height>
+                        </rect>
+                    </property>
+                    <property name="text">
+                        <string>alphabétique</string>
+                    </property>
+                    <property name="checked">
+                        <bool>true</bool>
+                    </property>
+                </widget>
+            </widget>
+            <widget class="QLineEdit">
+                <property name="name">
+                    <cstring>LEFiltre</cstring>
+                </property>
+                <property name="geometry">
+                    <rect>
+                        <x>50</x>
+                        <y>60</y>
+                        <width>160</width>
+                        <height>30</height>
+                    </rect>
+                </property>
+            </widget>
+            <widget class="QToolButton">
+                <property name="name">
+                    <cstring>BNext</cstring>
+                </property>
+                <property name="geometry">
+                    <rect>
+                        <x>220</x>
+                        <y>60</y>
+                        <width>30</width>
+                        <height>31</height>
+                    </rect>
+                </property>
+                <property name="text">
+                    <string></string>
+                </property>
+                <property name="iconSet">
+                    <iconset>image0</iconset>
+                </property>
+                <property name="toolTip" stdset="0">
+                    <string>affiche la prochaine occurence</string>
+                </property>
+            </widget>
+            <widget class="QLabel">
+                <property name="name">
+                    <cstring>textLabel1_4</cstring>
+                </property>
+                <property name="geometry">
+                    <rect>
+                        <x>50</x>
+                        <y>20</y>
+                        <width>171</width>
+                        <height>21</height>
+                    </rect>
+                </property>
+                <property name="text">
+                    <string>&lt;b&gt;&lt;u&gt;Commandes :&lt;/u&gt;&lt;/b&gt;</string>
+                </property>
+            </widget>
+        </widget>
+    </widget>
+</widget>
+<images>
+    <image name="image0">
+        <data format="PNG" length="264">89504e470d0a1a0a0000000d49484452000000210000000e0806000000a11e758c000000cf49444154388dd594db0ec3200c43edfdf8d897bb0f345b480845d51eb64888f412e76001c00f046fd6e99bba77200480924a1032c92efbd8c7d5cabcc025400099e957849568fe7f06c0ded1deb32b4a1ec4ea824b9e74097165bd01f85527f78a7201e0a3129f345a017c543bafdc983d0f7109d15a331b471f47072c17494a82338f6178203a8817e67306b1f08b07ba03e602c9b831077e37e0209e67e3386710977b17de80c185ad38695a51d522c82ce77912e2fed8be83762092f52b1820dd11bb10e565b53a5a3bbaff130713d66fa6981857060000000049454e44ae426082</data>
+    </image>
+</images>
+<connections>
+    <connection>
+        <sender>LBNouvCommande</sender>
+        <signal>clicked(QListBoxItem*)</signal>
+        <receiver>DComm</receiver>
+        <slot>LBNouvCommandeClicked()</slot>
+    </connection>
+    <connection>
+        <sender>LEFiltre</sender>
+        <signal>textChanged(const QString&amp;)</signal>
+        <receiver>DComm</receiver>
+        <slot>LEFiltreTextChanged()</slot>
+    </connection>
+    <connection>
+        <sender>LEFiltre</sender>
+        <signal>returnPressed()</signal>
+        <receiver>DComm</receiver>
+        <slot>LEfiltreReturnPressed()</slot>
+    </connection>
+    <connection>
+        <sender>bSup</sender>
+        <signal>pressed()</signal>
+        <receiver>DComm</receiver>
+        <slot>BSupPressed()</slot>
+    </connection>
+    <connection>
+        <sender>bOk</sender>
+        <signal>clicked()</signal>
+        <receiver>DComm</receiver>
+        <slot>BOkPressed()</slot>
+    </connection>
+    <connection>
+        <sender>LENomConcept</sender>
+        <signal>returnPressed()</signal>
+        <receiver>DComm</receiver>
+        <slot>LENomConceptReturnPressed()</slot>
+    </connection>
+    <connection>
+        <sender>RBGroupe</sender>
+        <signal>clicked()</signal>
+        <receiver>DComm</receiver>
+        <slot>BuildTabCommand()</slot>
+    </connection>
+    <connection>
+        <sender>RBalpha</sender>
+        <signal>clicked()</signal>
+        <receiver>DComm</receiver>
+        <slot>BuildTabCommand()</slot>
+    </connection>
+    <connection>
+        <sender>bHelp</sender>
+        <signal>clicked()</signal>
+        <receiver>DComm</receiver>
+        <slot>BHelpPressed()</slot>
+    </connection>
+    <connection>
+        <sender>BNext</sender>
+        <signal>pressed()</signal>
+        <receiver>DComm</receiver>
+        <slot>BNextPressed()</slot>
+    </connection>
+</connections>
+<slots>
+    <slot>LBNouvCommandeClicked()</slot>
+    <slot>LEFiltreTextChanged()</slot>
+    <slot>LEfiltreReturnPressed()</slot>
+    <slot>BSupPressed()</slot>
+    <slot>LENomConceptReturnPressed()</slot>
+    <slot>BOkPressed()</slot>
+    <slot>BuildTabCommand()</slot>
+    <slot>BHelpPressed()</slot>
+    <slot>BNextPressed()</slot>
+</slots>
+<layoutdefaults spacing="6" margin="11"/>
+</UI>
diff --git a/Ui/desCommentaire.py b/Ui/desCommentaire.py
new file mode 100644 (file)
index 0000000..2f4ef35
--- /dev/null
@@ -0,0 +1,70 @@
+# -*- coding: utf-8 -*-
+
+# Form implementation generated from reading ui file 'desCommentaire.ui'
+#
+# Created: lun mar 19 11:05:34 2007
+#      by: The PyQt User Interface Compiler (pyuic) 3.13
+#
+# WARNING! All changes made in this file will be lost!
+
+
+from qt import *
+
+
+class DComment(QWidget):
+    def __init__(self,parent = None,name = None,fl = 0):
+        QWidget.__init__(self,parent,name,fl)
+
+        if not name:
+            self.setName("DComment")
+
+        self.setMinimumSize(QSize(350,0))
+
+
+        self.bSup = QPushButton(self,"bSup")
+        self.bSup.setGeometry(QRect(310,420,142,30))
+        self.bSup.setAutoDefault(1)
+
+        self.bHelp = QPushButton(self,"bHelp")
+        self.bHelp.setGeometry(QRect(10,420,142,30))
+        self.bHelp.setAutoDefault(1)
+
+        self.textLabel1 = QLabel(self,"textLabel1")
+        self.textLabel1.setGeometry(QRect(160,10,120,21))
+
+        self.textCommentaire = QTextEdit(self,"textCommentaire")
+        self.textCommentaire.setGeometry(QRect(10,40,451,360))
+
+        self.bOk = QPushButton(self,"bOk")
+        self.bOk.setGeometry(QRect(160,420,142,30))
+        self.bOk.setAutoDefault(1)
+        self.bOk.setDefault(1)
+
+        self.languageChange()
+
+        self.resize(QSize(475,480).expandedTo(self.minimumSizeHint()))
+        self.clearWState(Qt.WState_Polished)
+
+        self.connect(self.textCommentaire,SIGNAL("returnPressed()"),self.TexteCommentaireEntre)
+        self.connect(self.bOk,SIGNAL("clicked()"),self.TexteCommentaireEntre)
+
+
+    def languageChange(self):
+        self.setCaption(self.__tr("Form1"))
+        self.bSup.setText(self.__tr("&Supprimer"))
+        self.bSup.setAccel(self.__tr("Alt+S"))
+        QToolTip.add(self.bSup,self.__tr("suppression du mot clef"))
+        self.bHelp.setText(self.__tr("&Documentation"))
+        self.bHelp.setAccel(self.__tr("Alt+D"))
+        QToolTip.add(self.bHelp,self.__tr("affichage documentation aster"))
+        self.textLabel1.setText(self.__tr("<p align=\"center\"><b>Texte du Commentaire</b></p>"))
+        self.bOk.setText(self.__tr("&Valider"))
+        self.bOk.setAccel(self.__tr("Shift+A, Alt+A, Alt+A, Alt+A"))
+        QToolTip.add(self.bOk,self.__tr("validation de la saisie"))
+
+
+    def TexteCommentaireEntre(self):
+        print "DComment.TexteCommentaireEntre(): Not implemented yet"
+
+    def __tr(self,s,c = None):
+        return qApp.translate("DComment",s,c)
diff --git a/Ui/desCommentaire.ui b/Ui/desCommentaire.ui
new file mode 100644 (file)
index 0000000..e161ac5
--- /dev/null
@@ -0,0 +1,150 @@
+<!DOCTYPE UI><UI version="3.3" stdsetdef="1">
+<class>DComment</class>
+<widget class="QWidget">
+    <property name="name">
+        <cstring>DComment</cstring>
+    </property>
+    <property name="geometry">
+        <rect>
+            <x>0</x>
+            <y>0</y>
+            <width>475</width>
+            <height>480</height>
+        </rect>
+    </property>
+    <property name="minimumSize">
+        <size>
+            <width>350</width>
+            <height>0</height>
+        </size>
+    </property>
+    <property name="caption">
+        <string>Form1</string>
+    </property>
+    <widget class="QPushButton">
+        <property name="name">
+            <cstring>bSup</cstring>
+        </property>
+        <property name="geometry">
+            <rect>
+                <x>310</x>
+                <y>420</y>
+                <width>142</width>
+                <height>30</height>
+            </rect>
+        </property>
+        <property name="text">
+            <string>&amp;Supprimer</string>
+        </property>
+        <property name="accel">
+            <string>Alt+S</string>
+        </property>
+        <property name="autoDefault">
+            <bool>true</bool>
+        </property>
+        <property name="toolTip" stdset="0">
+            <string>suppression du mot clef</string>
+        </property>
+    </widget>
+    <widget class="QPushButton">
+        <property name="name">
+            <cstring>bHelp</cstring>
+        </property>
+        <property name="geometry">
+            <rect>
+                <x>10</x>
+                <y>420</y>
+                <width>142</width>
+                <height>30</height>
+            </rect>
+        </property>
+        <property name="text">
+            <string>&amp;Documentation</string>
+        </property>
+        <property name="accel">
+            <string>Alt+D</string>
+        </property>
+        <property name="autoDefault">
+            <bool>true</bool>
+        </property>
+        <property name="toolTip" stdset="0">
+            <string>affichage documentation aster</string>
+        </property>
+    </widget>
+    <widget class="QLabel">
+        <property name="name">
+            <cstring>textLabel1</cstring>
+        </property>
+        <property name="geometry">
+            <rect>
+                <x>160</x>
+                <y>10</y>
+                <width>120</width>
+                <height>21</height>
+            </rect>
+        </property>
+        <property name="text">
+            <string>&lt;p align="center"&gt;&lt;b&gt;Texte du Commentaire&lt;/b&gt;&lt;/p&gt;</string>
+        </property>
+    </widget>
+    <widget class="QTextEdit">
+        <property name="name">
+            <cstring>textCommentaire</cstring>
+        </property>
+        <property name="geometry">
+            <rect>
+                <x>10</x>
+                <y>40</y>
+                <width>451</width>
+                <height>360</height>
+            </rect>
+        </property>
+    </widget>
+    <widget class="QPushButton">
+        <property name="name">
+            <cstring>bOk</cstring>
+        </property>
+        <property name="geometry">
+            <rect>
+                <x>160</x>
+                <y>420</y>
+                <width>142</width>
+                <height>30</height>
+            </rect>
+        </property>
+        <property name="text">
+            <string>&amp;Valider</string>
+        </property>
+        <property name="accel">
+            <string>Shift+A, Alt+A, Alt+A, Alt+A</string>
+        </property>
+        <property name="autoDefault">
+            <bool>true</bool>
+        </property>
+        <property name="default">
+            <bool>true</bool>
+        </property>
+        <property name="toolTip" stdset="0">
+            <string>validation de la saisie</string>
+        </property>
+    </widget>
+</widget>
+<connections>
+    <connection>
+        <sender>textCommentaire</sender>
+        <signal>returnPressed()</signal>
+        <receiver>DComment</receiver>
+        <slot>TexteCommentaireEntre()</slot>
+    </connection>
+    <connection>
+        <sender>bOk</sender>
+        <signal>clicked()</signal>
+        <receiver>DComment</receiver>
+        <slot>TexteCommentaireEntre()</slot>
+    </connection>
+</connections>
+<slots>
+    <slot>TexteCommentaireEntre()</slot>
+</slots>
+<layoutdefaults spacing="6" margin="11"/>
+</UI>
diff --git a/Ui/desFormule.py b/Ui/desFormule.py
new file mode 100644 (file)
index 0000000..5c5aa32
--- /dev/null
@@ -0,0 +1,226 @@
+# -*- coding: utf-8 -*-
+
+# Form implementation generated from reading ui file 'desFormule.ui'
+#
+# Created: mar aoû 7 16:45:45 2007
+#      by: The PyQt User Interface Compiler (pyuic) 3.13
+#
+# WARNING! All changes made in this file will be lost!
+
+
+from qt import *
+
+image0_data = \
+    "\x89\x50\x4e\x47\x0d\x0a\x1a\x0a\x00\x00\x00\x0d" \
+    "\x49\x48\x44\x52\x00\x00\x00\x21\x00\x00\x00\x0e" \
+    "\x08\x06\x00\x00\x00\xa1\x1e\x75\x8c\x00\x00\x00" \
+    "\xcf\x49\x44\x41\x54\x38\x8d\xd5\x94\xdb\x0e\xc3" \
+    "\x20\x0c\x43\xed\xfd\xf8\xd8\x97\xbb\x0f\x34\x5b" \
+    "\x48\x08\x45\xd5\x1e\xb6\x48\x88\xf4\x12\xe7\x60" \
+    "\x01\xc0\x0f\x04\x6f\xd6\xe9\x9b\xba\x77\x20\x04" \
+    "\x80\x92\x4a\x10\x32\xc9\x2e\xfb\xd8\xc7\xd5\xca" \
+    "\xbc\xc0\x25\x40\x00\x99\xe9\x57\x84\x95\x68\xfe" \
+    "\x7f\x06\xc0\xde\xd1\xde\xb3\x2b\x4a\x1e\xc4\xea" \
+    "\x82\x4b\x9e\x74\x09\x71\x65\xbd\x01\xf8\x55\x27" \
+    "\xf7\x8a\x72\x01\xe0\xa3\x12\x9f\x34\x5a\x01\x7c" \
+    "\x54\x3b\xaf\xdc\x98\x3d\x0f\x71\x09\xd1\x5a\x33" \
+    "\x1b\x47\x1f\x47\x07\x2c\x17\x49\x4a\x82\x33\x8f" \
+    "\x61\x78\x20\x3a\x88\x17\xe6\x73\x06\xb1\xf0\x8b" \
+    "\x07\xba\x03\xe6\x02\xc9\xb8\x31\x07\x7e\x37\xe0" \
+    "\x20\x9e\x67\xe3\x38\x67\x10\x97\x7b\x17\xde\x80" \
+    "\xc1\x85\xad\x38\x69\x5a\x51\xd5\x22\xc8\x2c\xe7" \
+    "\x79\x12\xe2\xfe\xd8\xbe\x83\x76\x20\x92\xf5\x2b" \
+    "\x18\x20\xdd\x11\xbb\x10\xe5\x65\xb5\x3a\x5a\x3b" \
+    "\xba\xff\x13\x07\x13\xd6\x6f\xa6\x98\x18\x57\x06" \
+    "\x00\x00\x00\x00\x49\x45\x4e\x44\xae\x42\x60\x82"
+
+class DFormule(QWidget):
+    def __init__(self,parent = None,name = None,fl = 0):
+        QWidget.__init__(self,parent,name,fl)
+
+        self.image0 = QPixmap()
+        self.image0.loadFromData(image0_data,"PNG")
+        if not name:
+            self.setName("DFormule")
+
+        self.setMinimumSize(QSize(505,0))
+
+
+        self.bSup = QPushButton(self,"bSup")
+        self.bSup.setGeometry(QRect(320,440,142,30))
+        self.bSup.setAutoDefault(1)
+
+        self.bHelp = QPushButton(self,"bHelp")
+        self.bHelp.setGeometry(QRect(10,440,142,30))
+        self.bHelp.setAutoDefault(1)
+
+        self.Commentaire = QLabel(self,"Commentaire")
+        self.Commentaire.setGeometry(QRect(-8,404,490,20))
+
+        self.bOk = QPushButton(self,"bOk")
+        self.bOk.setGeometry(QRect(170,440,142,30))
+        self.bOk.setAutoDefault(1)
+        self.bOk.setDefault(1)
+
+        self.TWChoix = QTabWidget(self,"TWChoix")
+        self.TWChoix.setGeometry(QRect(0,0,500,400))
+
+        self.Formule = QWidget(self.TWChoix,"Formule")
+
+        self.textLabel1_2 = QLabel(self.Formule,"textLabel1_2")
+        self.textLabel1_2.setGeometry(QRect(290,10,80,20))
+
+        self.textLabel1 = QLabel(self.Formule,"textLabel1")
+        self.textLabel1.setGeometry(QRect(30,10,160,30))
+        self.textLabel1.setMinimumSize(QSize(0,0))
+
+        self.textLabel2 = QLabel(self.Formule,"textLabel2")
+        self.textLabel2.setGeometry(QRect(220,40,220,20))
+
+        self.textLabel1_5 = QLabel(self.Formule,"textLabel1_5")
+        self.textLabel1_5.setGeometry(QRect(30,180,420,20))
+        self.textLabel1_5.setMinimumSize(QSize(0,0))
+
+        self.textLabel1_3_2 = QLabel(self.Formule,"textLabel1_3_2")
+        self.textLabel1_3_2.setGeometry(QRect(28,306,401,31))
+
+        self.textLabel1_6 = QLabel(self.Formule,"textLabel1_6")
+        self.textLabel1_6.setGeometry(QRect(210,60,20,50))
+
+        self.textLabel2_2 = QLabel(self.Formule,"textLabel2_2")
+        self.textLabel2_2.setGeometry(QRect(210,130,49,20))
+
+        self.textLabel1_6_2 = QLabel(self.Formule,"textLabel1_6_2")
+        self.textLabel1_6_2.setGeometry(QRect(450,60,20,50))
+
+        self.LENomFormule = QLineEdit(self.Formule,"LENomFormule")
+        self.LENomFormule.setGeometry(QRect(30,70,171,31))
+
+        self.LENomsArgs = QLineEdit(self.Formule,"LENomsArgs")
+        self.LENomsArgs.setGeometry(QRect(220,70,230,31))
+
+        self.textLabel1_3 = QLabel(self.Formule,"textLabel1_3")
+        self.textLabel1_3.setGeometry(QRect(90,260,300,20))
+
+        self.LECorpsFormule = QLineEdit(self.Formule,"LECorpsFormule")
+        self.LECorpsFormule.setGeometry(QRect(20,220,440,31))
+        self.TWChoix.insertTab(self.Formule,QString(""))
+
+        self.Commande = QWidget(self.TWChoix,"Commande")
+
+        self.textLabel6 = QLabel(self.Commande,"textLabel6")
+        self.textLabel6.setGeometry(QRect(10,60,60,30))
+
+        self.textLabel4 = QLabel(self.Commande,"textLabel4")
+        self.textLabel4.setGeometry(QRect(90,340,300,30))
+
+        self.LBNouvCommande = QListBox(self.Commande,"LBNouvCommande")
+        self.LBNouvCommande.setGeometry(QRect(50,100,410,240))
+
+        self.buttonGroup1 = QButtonGroup(self.Commande,"buttonGroup1")
+        self.buttonGroup1.setGeometry(QRect(300,20,151,70))
+
+        self.RBGroupe = QRadioButton(self.buttonGroup1,"RBGroupe")
+        self.RBGroupe.setGeometry(QRect(20,40,101,20))
+
+        self.RBalpha = QRadioButton(self.buttonGroup1,"RBalpha")
+        self.RBalpha.setGeometry(QRect(20,20,101,20))
+        self.RBalpha.setChecked(1)
+
+        self.LEFiltre = QLineEdit(self.Commande,"LEFiltre")
+        self.LEFiltre.setGeometry(QRect(50,60,160,30))
+
+        self.textLabel1_4 = QLabel(self.Commande,"textLabel1_4")
+        self.textLabel1_4.setGeometry(QRect(50,20,171,21))
+
+        self.BNext = QToolButton(self.Commande,"BNext")
+        self.BNext.setGeometry(QRect(220,60,30,31))
+        self.BNext.setIconSet(QIconSet(self.image0))
+        self.TWChoix.insertTab(self.Commande,QString(""))
+
+        self.languageChange()
+
+        self.resize(QSize(529,484).expandedTo(self.minimumSizeHint()))
+        self.clearWState(Qt.WState_Polished)
+
+        self.connect(self.LBNouvCommande,SIGNAL("clicked(QListBoxItem*)"),self.LBNouvCommandeClicked)
+        self.connect(self.LEFiltre,SIGNAL("textChanged(const QString&)"),self.LEFiltreTextChanged)
+        self.connect(self.LEFiltre,SIGNAL("returnPressed()"),self.LEfiltreReturnPressed)
+        self.connect(self.bSup,SIGNAL("pressed()"),self.BSupPressed)
+        self.connect(self.bOk,SIGNAL("clicked()"),self.BOkPressed)
+        self.connect(self.RBalpha,SIGNAL("clicked()"),self.BuildTabCommand)
+        self.connect(self.RBGroupe,SIGNAL("clicked()"),self.BuildTabCommand)
+        self.connect(self.BNext,SIGNAL("clicked()"),self.BNextPressed)
+        self.connect(self.LENomFormule,SIGNAL("returnPressed()"),self.NomFormuleSaisi)
+        self.connect(self.LENomsArgs,SIGNAL("returnPressed()"),self.argsSaisis)
+        self.connect(self.LECorpsFormule,SIGNAL("returnPressed()"),self.FormuleSaisie)
+
+
+    def languageChange(self):
+        self.setCaption(self.__tr("DMacro"))
+        self.bSup.setText(self.__tr("&Supprimer"))
+        self.bSup.setAccel(self.__tr("Alt+S"))
+        QToolTip.add(self.bSup,self.__tr("suppression du mot clef"))
+        self.bHelp.setText(self.__tr("&Documentation"))
+        self.bHelp.setAccel(self.__tr("Alt+D"))
+        QToolTip.add(self.bHelp,self.__tr("affichage documentation aster"))
+        self.Commentaire.setText(QString.null)
+        self.bOk.setText(self.__tr("&Valider"))
+        self.bOk.setAccel(self.__tr("Shift+A, Alt+A, Alt+A, Alt+A"))
+        QToolTip.add(self.bOk,self.__tr("validation de la saisie"))
+        self.textLabel1_2.setText(self.__tr("<h3><p align=\"center\"><u><b>Arguments</b></u></p></h3>"))
+        self.textLabel1.setText(self.__tr("<h3><p align=\"center\"><u><b>Nom de la formule</b></u></p></h3>"))
+        self.textLabel2.setText(self.__trUtf8("\x76\x61\x72\x69\x61\x62\x6c\x65\x73\x20\x73\xc3\xa9\x70\x61\x72\xc3\xa9\x65\x73\x20\x70\x61\x72\x20\x64\x65\x73\x20\x22\x2c\x22\x20\x70\x61\x72\x20\x65\x78\x2e\x20\x3a\x20\x78\x2c\x79\x2c\x7a"))
+        self.textLabel1_5.setText(self.__tr("<h3><p align=\"center\"><u><b>Corps de la formule</b></u></p></h3>"))
+        self.textLabel1_3_2.setText(self.__trUtf8("\x43\x65\x20\x6e\x27\x65\x73\x74\x20\x71\x75\x27\x61\x70\x72\xc3\xa8\x73\x20\x61\x76\x6f\x69\x72\x20\x61\x70\x70\x75\x79\xc3\xa9\x20\x73\x75\x72\x20\x6c\x65\x20\x62\x6f\x75\x74\x6f\x6e\x20\x56\x61\x6c\x69\x64\x65\x72\x20\x71\x75\x65\x20\x6c\x65\x73\x20\x6e\x6f\x75\x76\x65\x6c\x6c\x65\x73\x0a\x76\x61\x65\x6c\x75\x72\x73\x20\x73\x65\x72\x6f\x6e\x74\x20\x65\x66\x66\x65\x63\x74\x69\x76\x65\x6d\x65\x6e\x74\x20\x70\x72\x69\x73\x65\x73\x20\x65\x6e\x20\x63\x6f\x6d\x70\x74\x65"))
+        self.textLabel1_6.setText(self.__tr("<h1><b>(</b></h1>"))
+        self.textLabel2_2.setText(self.__tr("<font size=\"+4\" face=\"Helvetica\"><b>=</b></font>"))
+        self.textLabel1_6_2.setText(self.__tr("<h1><b>)</b></h1>"))
+        self.textLabel1_3.setText(self.__trUtf8("\x52\x65\x74\x6f\x75\x72\x2d\x43\x68\x61\x72\x69\x6f\x74\x20\x70\x65\x72\x6d\x65\x74\x20\x64\x65\x20\x76\xc3\xa9\x72\x69\x66\x69\x65\x72\x20\x71\x75\x65\x20\x6c\x27\x65\x78\x70\x72\x65\x73\x73\x69\x6f\x6e\x20\x65\x73\x74\x20\x76\x61\x6c\x69\x64\x65\x2e"))
+        self.TWChoix.changeTab(self.Formule,self.__trUtf8("\x44\xc3\xa9\x66\x69\x6e\x69\x74\x69\x6f\x6e\x20\x46\x6f\x72\x6d\x75\x6c\x65"))
+        self.textLabel6.setText(self.__tr("Filtre"))
+        self.textLabel4.setText(self.__trUtf8("\x4c\x61\x20\x63\x6f\x6d\x6d\x61\x6e\x64\x65\x20\x63\x68\x6f\x69\x73\x69\x65\x20\x73\x65\x72\x61\x20\x61\x6a\x6f\x75\x74\xc3\xa9\x65\x20\x41\x50\x52\x45\x53\x20\x6c\x61\x20\x63\x6f\x6d\x6d\x61\x6e\x64\x65\x20\x63\x6f\x75\x72\x61\x6e\x74\x65"))
+        self.buttonGroup1.setTitle(self.__tr("Affichage"))
+        self.RBGroupe.setText(self.__tr("par groupe"))
+        self.RBalpha.setText(self.__trUtf8("\x61\x6c\x70\x68\x61\x62\xc3\xa9\x74\x69\x71\x75\x65"))
+        self.textLabel1_4.setText(self.__tr("<b><u>Commandes :</u></b>"))
+        self.BNext.setText(QString.null)
+        QToolTip.add(self.BNext,self.__tr("affiche la prochaine occurence"))
+        self.TWChoix.changeTab(self.Commande,self.__tr("Nouvelle Commande"))
+
+
+    def LBNouvCommandeClicked(self):
+        print "DFormule.LBNouvCommandeClicked(): Not implemented yet"
+
+    def LEFiltreTextChanged(self):
+        print "DFormule.LEFiltreTextChanged(): Not implemented yet"
+
+    def LEfiltreReturnPressed(self):
+        print "DFormule.LEfiltreReturnPressed(): Not implemented yet"
+
+    def BSupPressed(self):
+        print "DFormule.BSupPressed(): Not implemented yet"
+
+    def BOkPressed(self):
+        print "DFormule.BOkPressed(): Not implemented yet"
+
+    def BuildTabCommand(self):
+        print "DFormule.BuildTabCommand(): Not implemented yet"
+
+    def BNextPressed(self):
+        print "DFormule.BNextPressed(): Not implemented yet"
+
+    def NomFormuleSaisi(self):
+        print "DFormule.NomFormuleSaisi(): Not implemented yet"
+
+    def argsSaisis(self):
+        print "DFormule.argsSaisis(): Not implemented yet"
+
+    def FormuleSaisie(self):
+        print "DFormule.FormuleSaisie(): Not implemented yet"
+
+    def __tr(self,s,c = None):
+        return qApp.translate("DFormule",s,c)
+
+    def __trUtf8(self,s,c = None):
+        return qApp.translate("DFormule",s,c,QApplication.UnicodeUTF8)
diff --git a/Ui/desFormule.ui b/Ui/desFormule.ui
new file mode 100644 (file)
index 0000000..5afefa1
--- /dev/null
@@ -0,0 +1,577 @@
+<!DOCTYPE UI><UI version="3.3" stdsetdef="1">
+<class>DFormule</class>
+<widget class="QWidget">
+    <property name="name">
+        <cstring>DFormule</cstring>
+    </property>
+    <property name="geometry">
+        <rect>
+            <x>0</x>
+            <y>0</y>
+            <width>529</width>
+            <height>484</height>
+        </rect>
+    </property>
+    <property name="minimumSize">
+        <size>
+            <width>505</width>
+            <height>0</height>
+        </size>
+    </property>
+    <property name="caption">
+        <string>DMacro</string>
+    </property>
+    <widget class="QPushButton">
+        <property name="name">
+            <cstring>bSup</cstring>
+        </property>
+        <property name="geometry">
+            <rect>
+                <x>320</x>
+                <y>440</y>
+                <width>142</width>
+                <height>30</height>
+            </rect>
+        </property>
+        <property name="text">
+            <string>&amp;Supprimer</string>
+        </property>
+        <property name="accel">
+            <string>Alt+S</string>
+        </property>
+        <property name="autoDefault">
+            <bool>true</bool>
+        </property>
+        <property name="toolTip" stdset="0">
+            <string>suppression du mot clef</string>
+        </property>
+    </widget>
+    <widget class="QPushButton">
+        <property name="name">
+            <cstring>bHelp</cstring>
+        </property>
+        <property name="geometry">
+            <rect>
+                <x>10</x>
+                <y>440</y>
+                <width>142</width>
+                <height>30</height>
+            </rect>
+        </property>
+        <property name="text">
+            <string>&amp;Documentation</string>
+        </property>
+        <property name="accel">
+            <string>Alt+D</string>
+        </property>
+        <property name="autoDefault">
+            <bool>true</bool>
+        </property>
+        <property name="toolTip" stdset="0">
+            <string>affichage documentation aster</string>
+        </property>
+    </widget>
+    <widget class="QLabel">
+        <property name="name">
+            <cstring>Commentaire</cstring>
+        </property>
+        <property name="geometry">
+            <rect>
+                <x>-8</x>
+                <y>404</y>
+                <width>490</width>
+                <height>20</height>
+            </rect>
+        </property>
+        <property name="text">
+            <string></string>
+        </property>
+    </widget>
+    <widget class="QPushButton">
+        <property name="name">
+            <cstring>bOk</cstring>
+        </property>
+        <property name="geometry">
+            <rect>
+                <x>170</x>
+                <y>440</y>
+                <width>142</width>
+                <height>30</height>
+            </rect>
+        </property>
+        <property name="text">
+            <string>&amp;Valider</string>
+        </property>
+        <property name="accel">
+            <string>Shift+A, Alt+A, Alt+A, Alt+A</string>
+        </property>
+        <property name="autoDefault">
+            <bool>true</bool>
+        </property>
+        <property name="default">
+            <bool>true</bool>
+        </property>
+        <property name="toolTip" stdset="0">
+            <string>validation de la saisie</string>
+        </property>
+    </widget>
+    <widget class="QTabWidget">
+        <property name="name">
+            <cstring>TWChoix</cstring>
+        </property>
+        <property name="geometry">
+            <rect>
+                <x>0</x>
+                <y>0</y>
+                <width>500</width>
+                <height>400</height>
+            </rect>
+        </property>
+        <widget class="QWidget">
+            <property name="name">
+                <cstring>Formule</cstring>
+            </property>
+            <attribute name="title">
+                <string>Définition Formule</string>
+            </attribute>
+            <widget class="QLabel">
+                <property name="name">
+                    <cstring>textLabel1_2</cstring>
+                </property>
+                <property name="geometry">
+                    <rect>
+                        <x>290</x>
+                        <y>10</y>
+                        <width>80</width>
+                        <height>20</height>
+                    </rect>
+                </property>
+                <property name="text">
+                    <string>&lt;h3&gt;&lt;p align="center"&gt;&lt;u&gt;&lt;b&gt;Arguments&lt;/b&gt;&lt;/u&gt;&lt;/p&gt;&lt;/h3&gt;</string>
+                </property>
+            </widget>
+            <widget class="QLabel">
+                <property name="name">
+                    <cstring>textLabel1</cstring>
+                </property>
+                <property name="geometry">
+                    <rect>
+                        <x>30</x>
+                        <y>10</y>
+                        <width>160</width>
+                        <height>30</height>
+                    </rect>
+                </property>
+                <property name="minimumSize">
+                    <size>
+                        <width>0</width>
+                        <height>0</height>
+                    </size>
+                </property>
+                <property name="text">
+                    <string>&lt;h3&gt;&lt;p align="center"&gt;&lt;u&gt;&lt;b&gt;Nom de la formule&lt;/b&gt;&lt;/u&gt;&lt;/p&gt;&lt;/h3&gt;</string>
+                </property>
+            </widget>
+            <widget class="QLabel">
+                <property name="name">
+                    <cstring>textLabel2</cstring>
+                </property>
+                <property name="geometry">
+                    <rect>
+                        <x>220</x>
+                        <y>40</y>
+                        <width>220</width>
+                        <height>20</height>
+                    </rect>
+                </property>
+                <property name="text">
+                    <string>variables séparées par des "," par ex. : x,y,z</string>
+                </property>
+            </widget>
+            <widget class="QLabel">
+                <property name="name">
+                    <cstring>textLabel1_5</cstring>
+                </property>
+                <property name="geometry">
+                    <rect>
+                        <x>30</x>
+                        <y>180</y>
+                        <width>420</width>
+                        <height>20</height>
+                    </rect>
+                </property>
+                <property name="minimumSize">
+                    <size>
+                        <width>0</width>
+                        <height>0</height>
+                    </size>
+                </property>
+                <property name="text">
+                    <string>&lt;h3&gt;&lt;p align="center"&gt;&lt;u&gt;&lt;b&gt;Corps de la formule&lt;/b&gt;&lt;/u&gt;&lt;/p&gt;&lt;/h3&gt;</string>
+                </property>
+            </widget>
+            <widget class="QLabel">
+                <property name="name">
+                    <cstring>textLabel1_3_2</cstring>
+                </property>
+                <property name="geometry">
+                    <rect>
+                        <x>28</x>
+                        <y>306</y>
+                        <width>401</width>
+                        <height>31</height>
+                    </rect>
+                </property>
+                <property name="text">
+                    <string>Ce n'est qu'après avoir appuyé sur le bouton Valider que les nouvelles
+vaelurs seront effectivement prises en compte</string>
+                </property>
+            </widget>
+            <widget class="QLabel">
+                <property name="name">
+                    <cstring>textLabel1_6</cstring>
+                </property>
+                <property name="geometry">
+                    <rect>
+                        <x>210</x>
+                        <y>60</y>
+                        <width>20</width>
+                        <height>50</height>
+                    </rect>
+                </property>
+                <property name="text">
+                    <string>&lt;h1&gt;&lt;b&gt;(&lt;/b&gt;&lt;/h1&gt;</string>
+                </property>
+            </widget>
+            <widget class="QLabel">
+                <property name="name">
+                    <cstring>textLabel2_2</cstring>
+                </property>
+                <property name="geometry">
+                    <rect>
+                        <x>210</x>
+                        <y>130</y>
+                        <width>49</width>
+                        <height>20</height>
+                    </rect>
+                </property>
+                <property name="text">
+                    <string>&lt;font size="+4" face="Helvetica"&gt;&lt;b&gt;=&lt;/b&gt;&lt;/font&gt;</string>
+                </property>
+            </widget>
+            <widget class="QLabel">
+                <property name="name">
+                    <cstring>textLabel1_6_2</cstring>
+                </property>
+                <property name="geometry">
+                    <rect>
+                        <x>450</x>
+                        <y>60</y>
+                        <width>20</width>
+                        <height>50</height>
+                    </rect>
+                </property>
+                <property name="text">
+                    <string>&lt;h1&gt;&lt;b&gt;)&lt;/b&gt;&lt;/h1&gt;</string>
+                </property>
+            </widget>
+            <widget class="QLineEdit">
+                <property name="name">
+                    <cstring>LENomFormule</cstring>
+                </property>
+                <property name="geometry">
+                    <rect>
+                        <x>30</x>
+                        <y>70</y>
+                        <width>171</width>
+                        <height>31</height>
+                    </rect>
+                </property>
+            </widget>
+            <widget class="QLineEdit">
+                <property name="name">
+                    <cstring>LENomsArgs</cstring>
+                </property>
+                <property name="geometry">
+                    <rect>
+                        <x>220</x>
+                        <y>70</y>
+                        <width>230</width>
+                        <height>31</height>
+                    </rect>
+                </property>
+            </widget>
+            <widget class="QLabel">
+                <property name="name">
+                    <cstring>textLabel1_3</cstring>
+                </property>
+                <property name="geometry">
+                    <rect>
+                        <x>90</x>
+                        <y>260</y>
+                        <width>300</width>
+                        <height>20</height>
+                    </rect>
+                </property>
+                <property name="text">
+                    <string>Retour-Chariot permet de vérifier que l'expression est valide.</string>
+                </property>
+            </widget>
+            <widget class="QLineEdit">
+                <property name="name">
+                    <cstring>LECorpsFormule</cstring>
+                </property>
+                <property name="geometry">
+                    <rect>
+                        <x>20</x>
+                        <y>220</y>
+                        <width>440</width>
+                        <height>31</height>
+                    </rect>
+                </property>
+            </widget>
+        </widget>
+        <widget class="QWidget">
+            <property name="name">
+                <cstring>Commande</cstring>
+            </property>
+            <attribute name="title">
+                <string>Nouvelle Commande</string>
+            </attribute>
+            <widget class="QLabel">
+                <property name="name">
+                    <cstring>textLabel6</cstring>
+                </property>
+                <property name="geometry">
+                    <rect>
+                        <x>10</x>
+                        <y>60</y>
+                        <width>60</width>
+                        <height>30</height>
+                    </rect>
+                </property>
+                <property name="text">
+                    <string>Filtre</string>
+                </property>
+            </widget>
+            <widget class="QLabel">
+                <property name="name">
+                    <cstring>textLabel4</cstring>
+                </property>
+                <property name="geometry">
+                    <rect>
+                        <x>90</x>
+                        <y>340</y>
+                        <width>300</width>
+                        <height>30</height>
+                    </rect>
+                </property>
+                <property name="text">
+                    <string>La commande choisie sera ajoutée APRES la commande courante</string>
+                </property>
+            </widget>
+            <widget class="QListBox">
+                <property name="name">
+                    <cstring>LBNouvCommande</cstring>
+                </property>
+                <property name="geometry">
+                    <rect>
+                        <x>50</x>
+                        <y>100</y>
+                        <width>410</width>
+                        <height>240</height>
+                    </rect>
+                </property>
+            </widget>
+            <widget class="QButtonGroup">
+                <property name="name">
+                    <cstring>buttonGroup1</cstring>
+                </property>
+                <property name="geometry">
+                    <rect>
+                        <x>300</x>
+                        <y>20</y>
+                        <width>151</width>
+                        <height>70</height>
+                    </rect>
+                </property>
+                <property name="title">
+                    <string>Affichage</string>
+                </property>
+                <widget class="QRadioButton">
+                    <property name="name">
+                        <cstring>RBGroupe</cstring>
+                    </property>
+                    <property name="geometry">
+                        <rect>
+                            <x>20</x>
+                            <y>40</y>
+                            <width>101</width>
+                            <height>20</height>
+                        </rect>
+                    </property>
+                    <property name="text">
+                        <string>par groupe</string>
+                    </property>
+                </widget>
+                <widget class="QRadioButton">
+                    <property name="name">
+                        <cstring>RBalpha</cstring>
+                    </property>
+                    <property name="geometry">
+                        <rect>
+                            <x>20</x>
+                            <y>20</y>
+                            <width>101</width>
+                            <height>20</height>
+                        </rect>
+                    </property>
+                    <property name="text">
+                        <string>alphabétique</string>
+                    </property>
+                    <property name="checked">
+                        <bool>true</bool>
+                    </property>
+                </widget>
+            </widget>
+            <widget class="QLineEdit">
+                <property name="name">
+                    <cstring>LEFiltre</cstring>
+                </property>
+                <property name="geometry">
+                    <rect>
+                        <x>50</x>
+                        <y>60</y>
+                        <width>160</width>
+                        <height>30</height>
+                    </rect>
+                </property>
+            </widget>
+            <widget class="QLabel">
+                <property name="name">
+                    <cstring>textLabel1_4</cstring>
+                </property>
+                <property name="geometry">
+                    <rect>
+                        <x>50</x>
+                        <y>20</y>
+                        <width>171</width>
+                        <height>21</height>
+                    </rect>
+                </property>
+                <property name="text">
+                    <string>&lt;b&gt;&lt;u&gt;Commandes :&lt;/u&gt;&lt;/b&gt;</string>
+                </property>
+            </widget>
+            <widget class="QToolButton">
+                <property name="name">
+                    <cstring>BNext</cstring>
+                </property>
+                <property name="geometry">
+                    <rect>
+                        <x>220</x>
+                        <y>60</y>
+                        <width>30</width>
+                        <height>31</height>
+                    </rect>
+                </property>
+                <property name="text">
+                    <string></string>
+                </property>
+                <property name="iconSet">
+                    <iconset>image0</iconset>
+                </property>
+                <property name="toolTip" stdset="0">
+                    <string>affiche la prochaine occurence</string>
+                </property>
+            </widget>
+        </widget>
+    </widget>
+</widget>
+<images>
+    <image name="image0">
+        <data format="PNG" length="264">89504e470d0a1a0a0000000d49484452000000210000000e0806000000a11e758c000000cf49444154388dd594db0ec3200c43edfdf8d897bb0f345b480845d51eb64888f412e76001c00f046fd6e99bba77200480924a1032c92efbd8c7d5cabcc025400099e957849568fe7f06c0ded1deb32b4a1ec4ea824b9e74097165bd01f85527f78a7201e0a3129f345a017c543bafdc983d0f7109d15a331b471f47072c17494a82338f6178203a8817e67306b1f08b07ba03e602c9b831077e37e0209e67e3386710977b17de80c185ad38695a51d522c82ce77912e2fed8be83762092f52b1820dd11bb10e565b53a5a3bbaff130713d66fa6981857060000000049454e44ae426082</data>
+    </image>
+</images>
+<connections>
+    <connection>
+        <sender>LBNouvCommande</sender>
+        <signal>clicked(QListBoxItem*)</signal>
+        <receiver>DFormule</receiver>
+        <slot>LBNouvCommandeClicked()</slot>
+    </connection>
+    <connection>
+        <sender>LEFiltre</sender>
+        <signal>textChanged(const QString&amp;)</signal>
+        <receiver>DFormule</receiver>
+        <slot>LEFiltreTextChanged()</slot>
+    </connection>
+    <connection>
+        <sender>LEFiltre</sender>
+        <signal>returnPressed()</signal>
+        <receiver>DFormule</receiver>
+        <slot>LEfiltreReturnPressed()</slot>
+    </connection>
+    <connection>
+        <sender>bSup</sender>
+        <signal>pressed()</signal>
+        <receiver>DFormule</receiver>
+        <slot>BSupPressed()</slot>
+    </connection>
+    <connection>
+        <sender>bOk</sender>
+        <signal>clicked()</signal>
+        <receiver>DFormule</receiver>
+        <slot>BOkPressed()</slot>
+    </connection>
+    <connection>
+        <sender>RBalpha</sender>
+        <signal>clicked()</signal>
+        <receiver>DFormule</receiver>
+        <slot>BuildTabCommand()</slot>
+    </connection>
+    <connection>
+        <sender>RBGroupe</sender>
+        <signal>clicked()</signal>
+        <receiver>DFormule</receiver>
+        <slot>BuildTabCommand()</slot>
+    </connection>
+    <connection>
+        <sender>BNext</sender>
+        <signal>clicked()</signal>
+        <receiver>DFormule</receiver>
+        <slot>BNextPressed()</slot>
+    </connection>
+    <connection>
+        <sender>LENomFormule</sender>
+        <signal>returnPressed()</signal>
+        <receiver>DFormule</receiver>
+        <slot>NomFormuleSaisi()</slot>
+    </connection>
+    <connection>
+        <sender>LENomsArgs</sender>
+        <signal>returnPressed()</signal>
+        <receiver>DFormule</receiver>
+        <slot>argsSaisis()</slot>
+    </connection>
+    <connection>
+        <sender>LECorpsFormule</sender>
+        <signal>returnPressed()</signal>
+        <receiver>DFormule</receiver>
+        <slot>FormuleSaisie()</slot>
+    </connection>
+</connections>
+<slots>
+    <slot>LBNouvCommandeClicked()</slot>
+    <slot>LEFiltreTextChanged()</slot>
+    <slot>LEfiltreReturnPressed()</slot>
+    <slot>BSupPressed()</slot>
+    <slot>BOkPressed()</slot>
+    <slot>BuildTabCommand()</slot>
+    <slot>BNextPressed()</slot>
+    <slot>NomFormuleSaisi()</slot>
+    <slot>argsSaisis()</slot>
+    <slot>FormuleSaisie()</slot>
+</slots>
+<layoutdefaults spacing="6" margin="11"/>
+</UI>
diff --git a/Ui/desInactif.py b/Ui/desInactif.py
new file mode 100644 (file)
index 0000000..72b72ff
--- /dev/null
@@ -0,0 +1,76 @@
+# -*- coding: utf-8 -*-
+
+# Form implementation generated from reading ui file 'desInactif.ui'
+#
+# Created: lun mar 5 14:01:29 2007
+#      by: The PyQt User Interface Compiler (pyuic) 3.13
+#
+# WARNING! All changes made in this file will be lost!
+
+
+from qt import *
+
+
+class DInactif(QWidget):
+    def __init__(self,parent = None,name = None,fl = 0):
+        QWidget.__init__(self,parent,name,fl)
+
+        if not name:
+            self.setName("DInactif")
+
+        self.setMinimumSize(QSize(350,0))
+
+
+        self.textLabel1_4 = QLabel(self,"textLabel1_4")
+        self.textLabel1_4.setGeometry(QRect(30,240,420,20))
+
+        self.textLabel1 = QLabel(self,"textLabel1")
+        self.textLabel1.setGeometry(QRect(30,220,420,20))
+
+        self.textLabel1_4_2 = QLabel(self,"textLabel1_4_2")
+        self.textLabel1_4_2.setGeometry(QRect(30,260,420,20))
+
+        self.bSup = QPushButton(self,"bSup")
+        self.bSup.setGeometry(QRect(170,430,142,30))
+        self.bSup.setAutoDefault(1)
+
+        self.textLabel1_3 = QLabel(self,"textLabel1_3")
+        self.textLabel1_3.setGeometry(QRect(20,130,420,20))
+
+        self.languageChange()
+
+        self.resize(QSize(482,480).expandedTo(self.minimumSizeHint()))
+        self.clearWState(Qt.WState_Polished)
+
+        self.connect(self.bSup,SIGNAL("clicked()"),self.BSupPressed)
+
+
+    def languageChange(self):
+        self.setCaption(QString.null)
+        self.textLabel1_4.setText(self.__tr("<font size=\"+2\"><p align=\"center\">\n"
+" DEBUT / POURSUITE et FIN\n"
+"</p></font>"))
+        self.textLabel1.setText(self.__trUtf8("\x3c\x66\x6f\x6e\x74\x20\x73\x69\x7a\x65\x3d\x22\x2b\x32\x22\x3e\x3c\x70\x20\x61\x6c\x69\x67\x6e\x3d\x22\x63\x65\x6e\x74\x65\x72\x22\x3e\x0a\x53\x65\x75\x6c\x65\x73\x20\x6c\x65\x73\x20\x63\x6f\x6d\x6d\x61\x6e\x64\x65\x73\x20\x70\x6c\x61\x63\xc3\xa9\x65\x73\x20\x65\x6e\x74\x72\x65\x20\x3a\x0a\x3c\x2f\x70\x3e\x3c\x2f\x66\x6f\x6e\x74\x3e"))
+        self.textLabel1_4_2.setText(self.__tr("<font size=\"+2\"><p align=\"center\">\n"
+"sont actives\n"
+"</p></font>"))
+        self.bSup.setText(self.__tr("&Supprimer"))
+        self.bSup.setAccel(self.__tr("Alt+S"))
+        QToolTip.add(self.bSup,self.__tr("suppression du mot clef"))
+        self.textLabel1_3.setText(self.__trUtf8("\x3c\x66\x6f\x6e\x74\x20\x73\x69\x7a\x65\x3d\x22\x2b\x32\x22\x3e\x3c\x70\x20\x61\x6c\x69\x67\x6e\x3d\x22\x63\x65\x6e\x74\x65\x72\x22\x3e\x4c\x65\x20\x6e\x6f\x65\x75\x64\x20\x73\xc3\xa9\x6c\x65\x63\x74\x69\x6f\x6e\x6e\xc3\xa9\x20\x6e\x65\x20\x63\x6f\x72\x72\x65\x73\x70\x6f\x6e\x64\x20\x70\x61\x73\x20\xc3\xa0\x20\x75\x6e\x20\x6f\x62\x6a\x65\x74\x20\x61\x63\x74\x69\x66\x2e\x3c\x2f\x70\x3e\x3c\x2f\x66\x6f\x6e\x74\x3e"))
+
+
+    def BSupPressed(self):
+        print "DInactif.BSupPressed(): Not implemented yet"
+
+    def ViewDoc(self):
+        print "DInactif.ViewDoc(): Not implemented yet"
+
+    def BOkPressed(self):
+        print "DInactif.BOkPressed(): Not implemented yet"
+
+    def __tr(self,s,c = None):
+        return qApp.translate("DInactif",s,c)
+
+    def __trUtf8(self,s,c = None):
+        return qApp.translate("DInactif",s,c,QApplication.UnicodeUTF8)
diff --git a/Ui/desInactif.ui b/Ui/desInactif.ui
new file mode 100644 (file)
index 0000000..c5a6b80
--- /dev/null
@@ -0,0 +1,134 @@
+<!DOCTYPE UI><UI version="3.3" stdsetdef="1">
+<class>DInactif</class>
+<widget class="QWidget">
+    <property name="name">
+        <cstring>DInactif</cstring>
+    </property>
+    <property name="geometry">
+        <rect>
+            <x>0</x>
+            <y>0</y>
+            <width>482</width>
+            <height>480</height>
+        </rect>
+    </property>
+    <property name="minimumSize">
+        <size>
+            <width>350</width>
+            <height>0</height>
+        </size>
+    </property>
+    <property name="caption">
+        <string></string>
+    </property>
+    <widget class="QLabel">
+        <property name="name">
+            <cstring>textLabel1_4</cstring>
+        </property>
+        <property name="geometry">
+            <rect>
+                <x>30</x>
+                <y>240</y>
+                <width>420</width>
+                <height>20</height>
+            </rect>
+        </property>
+        <property name="text">
+            <string>&lt;font size="+2"&gt;&lt;p align="center"&gt;
+ DEBUT / POURSUITE et FIN
+&lt;/p&gt;&lt;/font&gt;</string>
+        </property>
+    </widget>
+    <widget class="QLabel">
+        <property name="name">
+            <cstring>textLabel1</cstring>
+        </property>
+        <property name="geometry">
+            <rect>
+                <x>30</x>
+                <y>220</y>
+                <width>420</width>
+                <height>20</height>
+            </rect>
+        </property>
+        <property name="text">
+            <string>&lt;font size="+2"&gt;&lt;p align="center"&gt;
+Seules les commandes placées entre :
+&lt;/p&gt;&lt;/font&gt;</string>
+        </property>
+    </widget>
+    <widget class="QLabel">
+        <property name="name">
+            <cstring>textLabel1_4_2</cstring>
+        </property>
+        <property name="geometry">
+            <rect>
+                <x>30</x>
+                <y>260</y>
+                <width>420</width>
+                <height>20</height>
+            </rect>
+        </property>
+        <property name="text">
+            <string>&lt;font size="+2"&gt;&lt;p align="center"&gt;
+sont actives
+&lt;/p&gt;&lt;/font&gt;</string>
+        </property>
+    </widget>
+    <widget class="QPushButton">
+        <property name="name">
+            <cstring>bSup</cstring>
+        </property>
+        <property name="geometry">
+            <rect>
+                <x>170</x>
+                <y>430</y>
+                <width>142</width>
+                <height>30</height>
+            </rect>
+        </property>
+        <property name="text">
+            <string>&amp;Supprimer</string>
+        </property>
+        <property name="accel">
+            <string>Alt+S</string>
+        </property>
+        <property name="autoDefault">
+            <bool>true</bool>
+        </property>
+        <property name="toolTip" stdset="0">
+            <string>suppression du mot clef</string>
+        </property>
+    </widget>
+    <widget class="QLabel">
+        <property name="name">
+            <cstring>textLabel1_3</cstring>
+        </property>
+        <property name="geometry">
+            <rect>
+                <x>20</x>
+                <y>130</y>
+                <width>420</width>
+                <height>20</height>
+            </rect>
+        </property>
+        <property name="text">
+            <string>&lt;font size="+2"&gt;&lt;p align="center"&gt;Le noeud sélectionné ne correspond pas à un objet actif.&lt;/p&gt;&lt;/font&gt;</string>
+        </property>
+    </widget>
+</widget>
+<connections>
+    <connection>
+        <sender>bSup</sender>
+        <signal>clicked()</signal>
+        <receiver>DInactif</receiver>
+        <slot>BSupPressed()</slot>
+    </connection>
+</connections>
+<slots>
+    <slot>BSupPressed()</slot>
+    <slot>ViewDoc()</slot>
+    <slot>BOkPressed()</slot>
+</slots>
+<layoutdefaults spacing="6" margin="11"/>
+</UI>
diff --git a/Ui/desMCFact.py b/Ui/desMCFact.py
new file mode 100644 (file)
index 0000000..cc10c42
--- /dev/null
@@ -0,0 +1,111 @@
+# -*- coding: utf-8 -*-
+
+# Form implementation generated from reading ui file 'desMCFact.ui'
+#
+# Created: mer mar 21 12:08:55 2007
+#      by: The PyQt User Interface Compiler (pyuic) 3.13
+#
+# WARNING! All changes made in this file will be lost!
+
+
+from qt import *
+
+
+class DMCFact(QWidget):
+    def __init__(self,parent = None,name = None,fl = 0):
+        QWidget.__init__(self,parent,name,fl)
+
+        if not name:
+            self.setName("DMCFact")
+
+        self.setMinimumSize(QSize(505,0))
+
+
+        self.Commentaire = QLabel(self,"Commentaire")
+        self.Commentaire.setGeometry(QRect(10,410,490,20))
+
+        self.bSup = QPushButton(self,"bSup")
+        self.bSup.setGeometry(QRect(320,440,142,30))
+        self.bSup.setAutoDefault(1)
+
+        self.bOk = QPushButton(self,"bOk")
+        self.bOk.setGeometry(QRect(170,440,142,30))
+        self.bOk.setAutoDefault(1)
+        self.bOk.setDefault(1)
+
+        self.bHelp = QPushButton(self,"bHelp")
+        self.bHelp.setGeometry(QRect(10,440,142,30))
+        self.bHelp.setAutoDefault(1)
+
+        self.TWChoix = QTabWidget(self,"TWChoix")
+        self.TWChoix.setGeometry(QRect(0,0,500,400))
+
+        self.MotClef = QWidget(self.TWChoix,"MotClef")
+
+        self.textLabel1_2 = QLabel(self.MotClef,"textLabel1_2")
+        self.textLabel1_2.setGeometry(QRect(360,0,50,37))
+
+        self.LBRegles = QListBox(self.MotClef,"LBRegles")
+        self.LBRegles.setGeometry(QRect(260,40,230,290))
+
+        self.textLabel1 = QLabel(self.MotClef,"textLabel1")
+        self.textLabel1.setGeometry(QRect(50,10,120,20))
+        self.textLabel1.setMinimumSize(QSize(0,0))
+
+        self.LBMCPermis = QListBox(self.MotClef,"LBMCPermis")
+        self.LBMCPermis.setGeometry(QRect(10,40,220,290))
+        self.LBMCPermis.setMinimumSize(QSize(0,0))
+        self.TWChoix.insertTab(self.MotClef,QString(""))
+
+        self.languageChange()
+
+        self.resize(QSize(521,499).expandedTo(self.minimumSizeHint()))
+        self.clearWState(Qt.WState_Polished)
+
+        self.connect(self.bSup,SIGNAL("pressed()"),self.BSupPressed)
+        self.connect(self.bOk,SIGNAL("clicked()"),self.BOkPressed)
+
+
+    def languageChange(self):
+        self.setCaption(self.__tr("DMacro"))
+        self.Commentaire.setText(QString.null)
+        self.bSup.setText(self.__tr("&Supprimer"))
+        self.bSup.setAccel(self.__tr("Alt+S"))
+        QToolTip.add(self.bSup,self.__tr("suppression du mot clef"))
+        self.bOk.setText(self.__tr("&Valider"))
+        self.bOk.setAccel(self.__tr("Shift+A, Alt+A, Alt+A, Alt+A"))
+        QToolTip.add(self.bOk,self.__tr("validation de la saisie"))
+        self.bHelp.setText(self.__tr("&Documentation"))
+        self.bHelp.setAccel(self.__tr("Alt+D"))
+        QToolTip.add(self.bHelp,self.__tr("affichage documentation aster"))
+        self.textLabel1_2.setText(self.__trUtf8("\x3c\x68\x33\x3e\x3c\x70\x20\x61\x6c\x69\x67\x6e\x3d\x22\x63\x65\x6e\x74\x65\x72\x22\x3e\x3c\x75\x3e\x3c\x62\x3e\x52\xc3\xa9\x67\x6c\x65\x73\x3c\x2f\x62\x3e\x3c\x2f\x75\x3e\x3c\x2f\x70\x3e\x3c\x2f\x68\x33\x3e"))
+        self.textLabel1.setText(self.__tr("<h3><p align=\"center\"><u><b>Mots Clefs Permis</b></u></p></h3>"))
+        self.TWChoix.changeTab(self.MotClef,self.__tr("Ajouter Mot-Clef"))
+
+
+    def LBNouvCommandeClicked(self):
+        print "DMCFact.LBNouvCommandeClicked(): Not implemented yet"
+
+    def LEFiltreTextChanged(self):
+        print "DMCFact.LEFiltreTextChanged(): Not implemented yet"
+
+    def LEfiltreReturnPressed(self):
+        print "DMCFact.LEfiltreReturnPressed(): Not implemented yet"
+
+    def BSupPressed(self):
+        print "DMCFact.BSupPressed(): Not implemented yet"
+
+    def BOkPressed(self):
+        print "DMCFact.BOkPressed(): Not implemented yet"
+
+    def buildTabCommand(self):
+        print "DMCFact.buildTabCommand(): Not implemented yet"
+
+    def BNextPressed(self):
+        print "DMCFact.BNextPressed(): Not implemented yet"
+
+    def __tr(self,s,c = None):
+        return qApp.translate("DMCFact",s,c)
+
+    def __trUtf8(self,s,c = None):
+        return qApp.translate("DMCFact",s,c,QApplication.UnicodeUTF8)
diff --git a/Ui/desMCFact.ui b/Ui/desMCFact.ui
new file mode 100644 (file)
index 0000000..6e7714a
--- /dev/null
@@ -0,0 +1,234 @@
+<!DOCTYPE UI><UI version="3.3" stdsetdef="1">
+<class>DMCFact</class>
+<widget class="QWidget">
+    <property name="name">
+        <cstring>DMCFact</cstring>
+    </property>
+    <property name="geometry">
+        <rect>
+            <x>0</x>
+            <y>0</y>
+            <width>521</width>
+            <height>499</height>
+        </rect>
+    </property>
+    <property name="minimumSize">
+        <size>
+            <width>505</width>
+            <height>0</height>
+        </size>
+    </property>
+    <property name="caption">
+        <string>DMacro</string>
+    </property>
+    <widget class="QLabel">
+        <property name="name">
+            <cstring>Commentaire</cstring>
+        </property>
+        <property name="geometry">
+            <rect>
+                <x>10</x>
+                <y>410</y>
+                <width>490</width>
+                <height>20</height>
+            </rect>
+        </property>
+        <property name="text">
+            <string></string>
+        </property>
+    </widget>
+    <widget class="QPushButton">
+        <property name="name">
+            <cstring>bSup</cstring>
+        </property>
+        <property name="geometry">
+            <rect>
+                <x>320</x>
+                <y>440</y>
+                <width>142</width>
+                <height>30</height>
+            </rect>
+        </property>
+        <property name="text">
+            <string>&amp;Supprimer</string>
+        </property>
+        <property name="accel">
+            <string>Alt+S</string>
+        </property>
+        <property name="autoDefault">
+            <bool>true</bool>
+        </property>
+        <property name="toolTip" stdset="0">
+            <string>suppression du mot clef</string>
+        </property>
+    </widget>
+    <widget class="QPushButton">
+        <property name="name">
+            <cstring>bOk</cstring>
+        </property>
+        <property name="geometry">
+            <rect>
+                <x>170</x>
+                <y>440</y>
+                <width>142</width>
+                <height>30</height>
+            </rect>
+        </property>
+        <property name="text">
+            <string>&amp;Valider</string>
+        </property>
+        <property name="accel">
+            <string>Shift+A, Alt+A, Alt+A, Alt+A</string>
+        </property>
+        <property name="autoDefault">
+            <bool>true</bool>
+        </property>
+        <property name="default">
+            <bool>true</bool>
+        </property>
+        <property name="toolTip" stdset="0">
+            <string>validation de la saisie</string>
+        </property>
+    </widget>
+    <widget class="QPushButton">
+        <property name="name">
+            <cstring>bHelp</cstring>
+        </property>
+        <property name="geometry">
+            <rect>
+                <x>10</x>
+                <y>440</y>
+                <width>142</width>
+                <height>30</height>
+            </rect>
+        </property>
+        <property name="text">
+            <string>&amp;Documentation</string>
+        </property>
+        <property name="accel">
+            <string>Alt+D</string>
+        </property>
+        <property name="autoDefault">
+            <bool>true</bool>
+        </property>
+        <property name="toolTip" stdset="0">
+            <string>affichage documentation aster</string>
+        </property>
+    </widget>
+    <widget class="QTabWidget">
+        <property name="name">
+            <cstring>TWChoix</cstring>
+        </property>
+        <property name="geometry">
+            <rect>
+                <x>0</x>
+                <y>0</y>
+                <width>500</width>
+                <height>400</height>
+            </rect>
+        </property>
+        <widget class="QWidget">
+            <property name="name">
+                <cstring>MotClef</cstring>
+            </property>
+            <attribute name="title">
+                <string>Ajouter Mot-Clef</string>
+            </attribute>
+            <widget class="QLabel">
+                <property name="name">
+                    <cstring>textLabel1_2</cstring>
+                </property>
+                <property name="geometry">
+                    <rect>
+                        <x>360</x>
+                        <y>0</y>
+                        <width>50</width>
+                        <height>37</height>
+                    </rect>
+                </property>
+                <property name="text">
+                    <string>&lt;h3&gt;&lt;p align="center"&gt;&lt;u&gt;&lt;b&gt;Régles&lt;/b&gt;&lt;/u&gt;&lt;/p&gt;&lt;/h3&gt;</string>
+                </property>
+            </widget>
+            <widget class="QListBox">
+                <property name="name">
+                    <cstring>LBRegles</cstring>
+                </property>
+                <property name="geometry">
+                    <rect>
+                        <x>260</x>
+                        <y>40</y>
+                        <width>230</width>
+                        <height>290</height>
+                    </rect>
+                </property>
+            </widget>
+            <widget class="QListBox">
+                <property name="name">
+                    <cstring>LBMCPermis</cstring>
+                </property>
+                <property name="geometry">
+                    <rect>
+                        <x>10</x>
+                        <y>40</y>
+                        <width>220</width>
+                        <height>290</height>
+                    </rect>
+                </property>
+                <property name="minimumSize">
+                    <size>
+                        <width>0</width>
+                        <height>0</height>
+                    </size>
+                </property>
+            </widget>
+            <widget class="QLabel">
+                <property name="name">
+                    <cstring>textLabel1</cstring>
+                </property>
+                <property name="geometry">
+                    <rect>
+                        <x>50</x>
+                        <y>10</y>
+                        <width>140</width>
+                        <height>20</height>
+                    </rect>
+                </property>
+                <property name="minimumSize">
+                    <size>
+                        <width>0</width>
+                        <height>0</height>
+                    </size>
+                </property>
+                <property name="text">
+                    <string>&lt;h3&gt;&lt;p align="center"&gt;&lt;u&gt;&lt;b&gt;Mots Clefs Permis&lt;/b&gt;&lt;/u&gt;&lt;/p&gt;&lt;/h3&gt;</string>
+                </property>
+            </widget>
+        </widget>
+    </widget>
+</widget>
+<connections>
+    <connection>
+        <sender>bSup</sender>
+        <signal>pressed()</signal>
+        <receiver>DMCFact</receiver>
+        <slot>BSupPressed()</slot>
+    </connection>
+    <connection>
+        <sender>bOk</sender>
+        <signal>clicked()</signal>
+        <receiver>DMCFact</receiver>
+        <slot>BOkPressed()</slot>
+    </connection>
+</connections>
+<slots>
+    <slot>LBNouvCommandeClicked()</slot>
+    <slot>LEFiltreTextChanged()</slot>
+    <slot>LEfiltreReturnPressed()</slot>
+    <slot>BSupPressed()</slot>
+    <slot>BOkPressed()</slot>
+    <slot>buildTabCommand()</slot>
+    <slot>BNextPressed()</slot>
+</slots>
+<layoutdefaults spacing="6" margin="11"/>
+</UI>
diff --git a/Ui/desMCListAjout.py b/Ui/desMCListAjout.py
new file mode 100644 (file)
index 0000000..61594a5
--- /dev/null
@@ -0,0 +1,91 @@
+# -*- coding: utf-8 -*-
+
+# Form implementation generated from reading ui file 'desMCListAjout.ui'
+#
+# Created: ven mar 23 12:13:13 2007
+#      by: The PyQt User Interface Compiler (pyuic) 3.13
+#
+# WARNING! All changes made in this file will be lost!
+
+
+from qt import *
+
+
+class DMCListAjout(QWidget):
+    def __init__(self,parent = None,name = None,fl = 0):
+        QWidget.__init__(self,parent,name,fl)
+
+        if not name:
+            self.setName("DMCListAjout")
+
+        self.setMinimumSize(QSize(350,0))
+
+
+        self.bSup = QPushButton(self,"bSup")
+        self.bSup.setGeometry(QRect(310,420,142,30))
+        self.bSup.setAutoDefault(1)
+
+        self.bOk = QPushButton(self,"bOk")
+        self.bOk.setGeometry(QRect(160,420,142,30))
+        self.bOk.setAutoDefault(1)
+        self.bOk.setDefault(1)
+
+        self.bHelp = QPushButton(self,"bHelp")
+        self.bHelp.setGeometry(QRect(10,420,142,30))
+        self.bHelp.setAutoDefault(1)
+
+        self.bAjout = QPushButton(self,"bAjout")
+        self.bAjout.setGeometry(QRect(160,260,142,30))
+        self.bAjout.setAutoDefault(1)
+        self.bAjout.setDefault(1)
+
+        self.textLabel1_2_2 = QLabel(self,"textLabel1_2_2")
+        self.textLabel1_2_2.setGeometry(QRect(180,170,89,33))
+
+        self.textLabel1 = QLabel(self,"textLabel1")
+        self.textLabel1.setGeometry(QRect(160,50,140,36))
+
+        self.textLabel1_2 = QLabel(self,"textLabel1_2")
+        self.textLabel1_2.setGeometry(QRect(170,80,120,20))
+
+        self.MCFacteur = QLabel(self,"MCFacteur")
+        self.MCFacteur.setGeometry(QRect(200,120,50,20))
+
+        self.languageChange()
+
+        self.resize(QSize(459,480).expandedTo(self.minimumSizeHint()))
+        self.clearWState(Qt.WState_Polished)
+
+        self.connect(self.bOk,SIGNAL("clicked()"),self.BAjoutClicked)
+        self.connect(self.bAjout,SIGNAL("clicked()"),self.BAjoutClicked)
+        self.connect(self.bSup,SIGNAL("clicked()"),self.BSupPressed)
+
+
+    def languageChange(self):
+        self.setCaption(self.__tr("Form1"))
+        self.bSup.setText(self.__tr("&Supprimer"))
+        self.bSup.setAccel(self.__tr("Alt+S"))
+        QToolTip.add(self.bSup,self.__tr("suppression du mot clef"))
+        self.bOk.setText(self.__tr("&Valider"))
+        self.bOk.setAccel(self.__tr("Shift+A, Alt+A, Alt+A, Alt+A"))
+        QToolTip.add(self.bOk,self.__tr("validation de la saisie"))
+        self.bHelp.setText(self.__tr("&Documentation"))
+        self.bHelp.setAccel(self.__tr("Alt+D"))
+        QToolTip.add(self.bHelp,self.__tr("affichage documentation aster"))
+        self.bAjout.setText(self.__tr("&Ajouter"))
+        self.bAjout.setAccel(self.__tr("Alt+A"))
+        QToolTip.add(self.bAjout,self.__tr("validation de la saisie"))
+        self.textLabel1_2_2.setText(self.__tr("<p align=\"center\"><font size=\"+1\">cliquez ci-dessous</font> </p>"))
+        self.textLabel1.setText(self.__tr("<p align=\"center\"><font size=\"+1\">Pour ajouter une autre occurrence</font></p>"))
+        self.textLabel1_2.setText(self.__tr("<p align=\"center\"><font size=\"+1\">du mot clef-facteur</font> </p>"))
+        self.MCFacteur.setText(self.__tr("<p align=\"center\">AFFE</p>"))
+
+
+    def BAjoutClicked(self):
+        print "DMCListAjout.BAjoutClicked(): Not implemented yet"
+
+    def BSupPressed(self):
+        print "DMCListAjout.BSupPressed(): Not implemented yet"
+
+    def __tr(self,s,c = None):
+        return qApp.translate("DMCListAjout",s,c)
diff --git a/Ui/desMCListAjout.ui b/Ui/desMCListAjout.ui
new file mode 100644 (file)
index 0000000..935c7bd
--- /dev/null
@@ -0,0 +1,220 @@
+<!DOCTYPE UI><UI version="3.3" stdsetdef="1">
+<class>DMCListAjout</class>
+<widget class="QWidget">
+    <property name="name">
+        <cstring>DMCListAjout</cstring>
+    </property>
+    <property name="geometry">
+        <rect>
+            <x>0</x>
+            <y>0</y>
+            <width>459</width>
+            <height>480</height>
+        </rect>
+    </property>
+    <property name="minimumSize">
+        <size>
+            <width>350</width>
+            <height>0</height>
+        </size>
+    </property>
+    <property name="caption">
+        <string>Form1</string>
+    </property>
+    <widget class="QPushButton">
+        <property name="name">
+            <cstring>bSup</cstring>
+        </property>
+        <property name="geometry">
+            <rect>
+                <x>310</x>
+                <y>420</y>
+                <width>142</width>
+                <height>30</height>
+            </rect>
+        </property>
+        <property name="text">
+            <string>&amp;Supprimer</string>
+        </property>
+        <property name="accel">
+            <string>Alt+S</string>
+        </property>
+        <property name="autoDefault">
+            <bool>true</bool>
+        </property>
+        <property name="toolTip" stdset="0">
+            <string>suppression du mot clef</string>
+        </property>
+    </widget>
+    <widget class="QPushButton">
+        <property name="name">
+            <cstring>bOk</cstring>
+        </property>
+        <property name="geometry">
+            <rect>
+                <x>160</x>
+                <y>420</y>
+                <width>142</width>
+                <height>30</height>
+            </rect>
+        </property>
+        <property name="text">
+            <string>&amp;Valider</string>
+        </property>
+        <property name="accel">
+            <string>Shift+A, Alt+A, Alt+A, Alt+A</string>
+        </property>
+        <property name="autoDefault">
+            <bool>true</bool>
+        </property>
+        <property name="default">
+            <bool>true</bool>
+        </property>
+        <property name="toolTip" stdset="0">
+            <string>validation de la saisie</string>
+        </property>
+    </widget>
+    <widget class="QPushButton">
+        <property name="name">
+            <cstring>bHelp</cstring>
+        </property>
+        <property name="geometry">
+            <rect>
+                <x>10</x>
+                <y>420</y>
+                <width>142</width>
+                <height>30</height>
+            </rect>
+        </property>
+        <property name="text">
+            <string>&amp;Documentation</string>
+        </property>
+        <property name="accel">
+            <string>Alt+D</string>
+        </property>
+        <property name="autoDefault">
+            <bool>true</bool>
+        </property>
+        <property name="toolTip" stdset="0">
+            <string>affichage documentation aster</string>
+        </property>
+    </widget>
+    <widget class="QPushButton">
+        <property name="name">
+            <cstring>bAjout</cstring>
+        </property>
+        <property name="geometry">
+            <rect>
+                <x>160</x>
+                <y>260</y>
+                <width>142</width>
+                <height>30</height>
+            </rect>
+        </property>
+        <property name="text">
+            <string>&amp;Ajouter</string>
+        </property>
+        <property name="accel">
+            <string>Alt+A</string>
+        </property>
+        <property name="autoDefault">
+            <bool>true</bool>
+        </property>
+        <property name="default">
+            <bool>true</bool>
+        </property>
+        <property name="toolTip" stdset="0">
+            <string>validation de la saisie</string>
+        </property>
+    </widget>
+    <widget class="QLabel">
+        <property name="name">
+            <cstring>textLabel1_2_2</cstring>
+        </property>
+        <property name="geometry">
+            <rect>
+                <x>180</x>
+                <y>170</y>
+                <width>89</width>
+                <height>33</height>
+            </rect>
+        </property>
+        <property name="text">
+            <string>&lt;p align="center"&gt;&lt;font size="+1"&gt;cliquez ci-dessous&lt;/font&gt; &lt;/p&gt;</string>
+        </property>
+    </widget>
+    <widget class="QLabel">
+        <property name="name">
+            <cstring>textLabel1</cstring>
+        </property>
+        <property name="geometry">
+            <rect>
+                <x>160</x>
+                <y>50</y>
+                <width>140</width>
+                <height>36</height>
+            </rect>
+        </property>
+        <property name="text">
+            <string>&lt;p align="center"&gt;&lt;font size="+1"&gt;Pour ajouter une autre occurrence&lt;/font&gt;&lt;/p&gt;</string>
+        </property>
+    </widget>
+    <widget class="QLabel">
+        <property name="name">
+            <cstring>textLabel1_2</cstring>
+        </property>
+        <property name="geometry">
+            <rect>
+                <x>170</x>
+                <y>80</y>
+                <width>120</width>
+                <height>20</height>
+            </rect>
+        </property>
+        <property name="text">
+            <string>&lt;p align="center"&gt;&lt;font size="+1"&gt;du mot clef-facteur&lt;/font&gt; &lt;/p&gt;</string>
+        </property>
+    </widget>
+    <widget class="QLabel">
+        <property name="name">
+            <cstring>MCFacteur</cstring>
+        </property>
+        <property name="geometry">
+            <rect>
+                <x>200</x>
+                <y>120</y>
+                <width>50</width>
+                <height>20</height>
+            </rect>
+        </property>
+        <property name="text">
+            <string>&lt;p align="center"&gt;AFFE&lt;/p&gt;</string>
+        </property>
+    </widget>
+</widget>
+<connections>
+    <connection>
+        <sender>bOk</sender>
+        <signal>clicked()</signal>
+        <receiver>DMCListAjout</receiver>
+        <slot>BAjoutClicked()</slot>
+    </connection>
+    <connection>
+        <sender>bAjout</sender>
+        <signal>clicked()</signal>
+        <receiver>DMCListAjout</receiver>
+        <slot>BAjoutClicked()</slot>
+    </connection>
+    <connection>
+        <sender>bSup</sender>
+        <signal>clicked()</signal>
+        <receiver>DMCListAjout</receiver>
+        <slot>BSupPressed()</slot>
+    </connection>
+</connections>
+<slots>
+    <slot>BAjoutClicked()</slot>
+    <slot>BSupPressed()</slot>
+</slots>
+<layoutdefaults spacing="6" margin="11"/>
+</UI>
diff --git a/Ui/desMacro.py b/Ui/desMacro.py
new file mode 100644 (file)
index 0000000..2ec81cd
--- /dev/null
@@ -0,0 +1,183 @@
+# -*- coding: utf-8 -*-
+
+# Form implementation generated from reading ui file 'desMacro.ui'
+#
+# Created: jeu avr 26 14:25:17 2007
+#      by: The PyQt User Interface Compiler (pyuic) 3.13
+#
+# WARNING! All changes made in this file will be lost!
+
+
+from qt import *
+
+image0_data = \
+    "\x89\x50\x4e\x47\x0d\x0a\x1a\x0a\x00\x00\x00\x0d" \
+    "\x49\x48\x44\x52\x00\x00\x00\x21\x00\x00\x00\x0e" \
+    "\x08\x06\x00\x00\x00\xa1\x1e\x75\x8c\x00\x00\x00" \
+    "\xcf\x49\x44\x41\x54\x38\x8d\xd5\x94\xdb\x0e\xc3" \
+    "\x20\x0c\x43\xed\xfd\xf8\xd8\x97\xbb\x0f\x34\x5b" \
+    "\x48\x08\x45\xd5\x1e\xb6\x48\x88\xf4\x12\xe7\x60" \
+    "\x01\xc0\x0f\x04\x6f\xd6\xe9\x9b\xba\x77\x20\x04" \
+    "\x80\x92\x4a\x10\x32\xc9\x2e\xfb\xd8\xc7\xd5\xca" \
+    "\xbc\xc0\x25\x40\x00\x99\xe9\x57\x84\x95\x68\xfe" \
+    "\x7f\x06\xc0\xde\xd1\xde\xb3\x2b\x4a\x1e\xc4\xea" \
+    "\x82\x4b\x9e\x74\x09\x71\x65\xbd\x01\xf8\x55\x27" \
+    "\xf7\x8a\x72\x01\xe0\xa3\x12\x9f\x34\x5a\x01\x7c" \
+    "\x54\x3b\xaf\xdc\x98\x3d\x0f\x71\x09\xd1\x5a\x33" \
+    "\x1b\x47\x1f\x47\x07\x2c\x17\x49\x4a\x82\x33\x8f" \
+    "\x61\x78\x20\x3a\x88\x17\xe6\x73\x06\xb1\xf0\x8b" \
+    "\x07\xba\x03\xe6\x02\xc9\xb8\x31\x07\x7e\x37\xe0" \
+    "\x20\x9e\x67\xe3\x38\x67\x10\x97\x7b\x17\xde\x80" \
+    "\xc1\x85\xad\x38\x69\x5a\x51\xd5\x22\xc8\x2c\xe7" \
+    "\x79\x12\xe2\xfe\xd8\xbe\x83\x76\x20\x92\xf5\x2b" \
+    "\x18\x20\xdd\x11\xbb\x10\xe5\x65\xb5\x3a\x5a\x3b" \
+    "\xba\xff\x13\x07\x13\xd6\x6f\xa6\x98\x18\x57\x06" \
+    "\x00\x00\x00\x00\x49\x45\x4e\x44\xae\x42\x60\x82"
+
+class DMacro(QWidget):
+    def __init__(self,parent = None,name = None,fl = 0):
+        QWidget.__init__(self,parent,name,fl)
+
+        self.image0 = QPixmap()
+        self.image0.loadFromData(image0_data,"PNG")
+        if not name:
+            self.setName("DMacro")
+
+        self.setMinimumSize(QSize(505,0))
+
+
+        self.Commentaire = QLabel(self,"Commentaire")
+        self.Commentaire.setGeometry(QRect(10,410,490,20))
+
+        self.bSup = QPushButton(self,"bSup")
+        self.bSup.setGeometry(QRect(320,440,142,30))
+        self.bSup.setAutoDefault(1)
+
+        self.bOk = QPushButton(self,"bOk")
+        self.bOk.setGeometry(QRect(170,440,142,30))
+        self.bOk.setAutoDefault(1)
+        self.bOk.setDefault(1)
+
+        self.bHelp = QPushButton(self,"bHelp")
+        self.bHelp.setGeometry(QRect(10,440,142,30))
+        self.bHelp.setAutoDefault(1)
+
+        self.TWChoix = QTabWidget(self,"TWChoix")
+        self.TWChoix.setGeometry(QRect(0,0,500,400))
+
+        self.MotClef = QWidget(self.TWChoix,"MotClef")
+
+        self.textLabel1_2 = QLabel(self.MotClef,"textLabel1_2")
+        self.textLabel1_2.setGeometry(QRect(360,0,50,37))
+
+        self.LBMCPermis = QListBox(self.MotClef,"LBMCPermis")
+        self.LBMCPermis.setGeometry(QRect(10,40,220,290))
+        self.LBMCPermis.setMinimumSize(QSize(0,0))
+
+        self.LBRegles = QListBox(self.MotClef,"LBRegles")
+        self.LBRegles.setGeometry(QRect(260,40,230,290))
+
+        self.textLabel1 = QLabel(self.MotClef,"textLabel1")
+        self.textLabel1.setGeometry(QRect(50,10,120,20))
+        self.textLabel1.setMinimumSize(QSize(0,0))
+        self.TWChoix.insertTab(self.MotClef,QString(""))
+
+        self.Commande = QWidget(self.TWChoix,"Commande")
+
+        self.textLabel6 = QLabel(self.Commande,"textLabel6")
+        self.textLabel6.setGeometry(QRect(10,60,60,30))
+
+        self.textLabel4 = QLabel(self.Commande,"textLabel4")
+        self.textLabel4.setGeometry(QRect(90,340,300,30))
+
+        self.LBNouvCommande = QListBox(self.Commande,"LBNouvCommande")
+        self.LBNouvCommande.setGeometry(QRect(50,100,410,240))
+
+        self.buttonGroup1 = QButtonGroup(self.Commande,"buttonGroup1")
+        self.buttonGroup1.setGeometry(QRect(300,20,151,70))
+
+        self.RBGroupe = QRadioButton(self.buttonGroup1,"RBGroupe")
+        self.RBGroupe.setGeometry(QRect(20,40,101,20))
+
+        self.RBalpha = QRadioButton(self.buttonGroup1,"RBalpha")
+        self.RBalpha.setGeometry(QRect(20,20,101,20))
+        self.RBalpha.setChecked(1)
+
+        self.LEFiltre = QLineEdit(self.Commande,"LEFiltre")
+        self.LEFiltre.setGeometry(QRect(50,60,160,30))
+
+        self.textLabel1_4 = QLabel(self.Commande,"textLabel1_4")
+        self.textLabel1_4.setGeometry(QRect(50,20,171,21))
+
+        self.BNext = QToolButton(self.Commande,"BNext")
+        self.BNext.setGeometry(QRect(220,60,30,31))
+        self.BNext.setIconSet(QIconSet(self.image0))
+        self.TWChoix.insertTab(self.Commande,QString(""))
+
+        self.languageChange()
+
+        self.resize(QSize(521,499).expandedTo(self.minimumSizeHint()))
+        self.clearWState(Qt.WState_Polished)
+
+        self.connect(self.LBNouvCommande,SIGNAL("clicked(QListBoxItem*)"),self.LBNouvCommandeClicked)
+        self.connect(self.LEFiltre,SIGNAL("textChanged(const QString&)"),self.LEFiltreTextChanged)
+        self.connect(self.LEFiltre,SIGNAL("returnPressed()"),self.LEfiltreReturnPressed)
+        self.connect(self.bSup,SIGNAL("pressed()"),self.BSupPressed)
+        self.connect(self.bOk,SIGNAL("clicked()"),self.BOkPressed)
+        self.connect(self.RBalpha,SIGNAL("clicked()"),self.BuildTabCommand)
+        self.connect(self.RBGroupe,SIGNAL("clicked()"),self.BuildTabCommand)
+        self.connect(self.BNext,SIGNAL("clicked()"),self.BNextPressed)
+
+
+    def languageChange(self):
+        self.setCaption(self.__tr("DMacro"))
+        self.Commentaire.setText(QString.null)
+        self.bSup.setText(self.__tr("&Supprimer"))
+        self.bSup.setAccel(self.__tr("Alt+S"))
+        QToolTip.add(self.bSup,self.__tr("suppression du mot clef"))
+        self.bOk.setText(self.__tr("&Valider"))
+        self.bOk.setAccel(self.__tr("Shift+A, Alt+A, Alt+A, Alt+A"))
+        QToolTip.add(self.bOk,self.__tr("validation de la saisie"))
+        self.bHelp.setText(self.__tr("&Documentation"))
+        self.bHelp.setAccel(self.__tr("Alt+D"))
+        QToolTip.add(self.bHelp,self.__tr("affichage documentation aster"))
+        self.textLabel1_2.setText(self.__trUtf8("\x3c\x68\x33\x3e\x3c\x70\x20\x61\x6c\x69\x67\x6e\x3d\x22\x63\x65\x6e\x74\x65\x72\x22\x3e\x3c\x75\x3e\x3c\x62\x3e\x52\xc3\xa9\x67\x6c\x65\x73\x3c\x2f\x62\x3e\x3c\x2f\x75\x3e\x3c\x2f\x70\x3e\x3c\x2f\x68\x33\x3e"))
+        self.textLabel1.setText(self.__tr("<h3><p align=\"center\"><u><b>Mots Clefs Permis</b></u></p></h3>"))
+        self.TWChoix.changeTab(self.MotClef,self.__tr("Ajouter Mot-Clef"))
+        self.textLabel6.setText(self.__tr("Filtre"))
+        self.textLabel4.setText(self.__trUtf8("\x4c\x61\x20\x63\x6f\x6d\x6d\x61\x6e\x64\x65\x20\x63\x68\x6f\x69\x73\x69\x65\x20\x73\x65\x72\x61\x20\x61\x6a\x6f\x75\x74\xc3\xa9\x65\x20\x41\x50\x52\x45\x53\x20\x6c\x61\x20\x63\x6f\x6d\x6d\x61\x6e\x64\x65\x20\x63\x6f\x75\x72\x61\x6e\x74\x65"))
+        self.buttonGroup1.setTitle(self.__tr("Affichage"))
+        self.RBGroupe.setText(self.__tr("par groupe"))
+        self.RBalpha.setText(self.__trUtf8("\x61\x6c\x70\x68\x61\x62\xc3\xa9\x74\x69\x71\x75\x65"))
+        self.textLabel1_4.setText(self.__tr("<b><u>Commandes :</u></b>"))
+        self.BNext.setText(QString.null)
+        QToolTip.add(self.BNext,self.__tr("affiche la prochaine occurence"))
+        self.TWChoix.changeTab(self.Commande,self.__tr("Nouvelle Commande"))
+
+
+    def LBNouvCommandeClicked(self):
+        print "DMacro.LBNouvCommandeClicked(): Not implemented yet"
+
+    def LEFiltreTextChanged(self):
+        print "DMacro.LEFiltreTextChanged(): Not implemented yet"
+
+    def LEfiltreReturnPressed(self):
+        print "DMacro.LEfiltreReturnPressed(): Not implemented yet"
+
+    def BSupPressed(self):
+        print "DMacro.BSupPressed(): Not implemented yet"
+
+    def BOkPressed(self):
+        print "DMacro.BOkPressed(): Not implemented yet"
+
+    def BuildTabCommand(self):
+        print "DMacro.BuildTabCommand(): Not implemented yet"
+
+    def BNextPressed(self):
+        print "DMacro.BNextPressed(): Not implemented yet"
+
+    def __tr(self,s,c = None):
+        return qApp.translate("DMacro",s,c)
+
+    def __trUtf8(self,s,c = None):
+        return qApp.translate("DMacro",s,c,QApplication.UnicodeUTF8)
diff --git a/Ui/desMacro.ui b/Ui/desMacro.ui
new file mode 100644 (file)
index 0000000..a54b2a6
--- /dev/null
@@ -0,0 +1,430 @@
+<!DOCTYPE UI><UI version="3.3" stdsetdef="1">
+<class>DMacro</class>
+<widget class="QWidget">
+    <property name="name">
+        <cstring>DMacro</cstring>
+    </property>
+    <property name="geometry">
+        <rect>
+            <x>0</x>
+            <y>0</y>
+            <width>521</width>
+            <height>499</height>
+        </rect>
+    </property>
+    <property name="minimumSize">
+        <size>
+            <width>505</width>
+            <height>0</height>
+        </size>
+    </property>
+    <property name="caption">
+        <string>DMacro</string>
+    </property>
+    <widget class="QLabel">
+        <property name="name">
+            <cstring>Commentaire</cstring>
+        </property>
+        <property name="geometry">
+            <rect>
+                <x>10</x>
+                <y>410</y>
+                <width>490</width>
+                <height>20</height>
+            </rect>
+        </property>
+        <property name="text">
+            <string></string>
+        </property>
+    </widget>
+    <widget class="QPushButton">
+        <property name="name">
+            <cstring>bSup</cstring>
+        </property>
+        <property name="geometry">
+            <rect>
+                <x>320</x>
+                <y>440</y>
+                <width>142</width>
+                <height>30</height>
+            </rect>
+        </property>
+        <property name="text">
+            <string>&amp;Supprimer</string>
+        </property>
+        <property name="accel">
+            <string>Alt+S</string>
+        </property>
+        <property name="autoDefault">
+            <bool>true</bool>
+        </property>
+        <property name="toolTip" stdset="0">
+            <string>suppression du mot clef</string>
+        </property>
+    </widget>
+    <widget class="QPushButton">
+        <property name="name">
+            <cstring>bOk</cstring>
+        </property>
+        <property name="geometry">
+            <rect>
+                <x>170</x>
+                <y>440</y>
+                <width>142</width>
+                <height>30</height>
+            </rect>
+        </property>
+        <property name="text">
+            <string>&amp;Valider</string>
+        </property>
+        <property name="accel">
+            <string>Shift+A, Alt+A, Alt+A, Alt+A</string>
+        </property>
+        <property name="autoDefault">
+            <bool>true</bool>
+        </property>
+        <property name="default">
+            <bool>true</bool>
+        </property>
+        <property name="toolTip" stdset="0">
+            <string>validation de la saisie</string>
+        </property>
+    </widget>
+    <widget class="QPushButton">
+        <property name="name">
+            <cstring>bHelp</cstring>
+        </property>
+        <property name="geometry">
+            <rect>
+                <x>10</x>
+                <y>440</y>
+                <width>142</width>
+                <height>30</height>
+            </rect>
+        </property>
+        <property name="text">
+            <string>&amp;Documentation</string>
+        </property>
+        <property name="accel">
+            <string>Alt+D</string>
+        </property>
+        <property name="autoDefault">
+            <bool>true</bool>
+        </property>
+        <property name="toolTip" stdset="0">
+            <string>affichage documentation aster</string>
+        </property>
+    </widget>
+    <widget class="QTabWidget">
+        <property name="name">
+            <cstring>TWChoix</cstring>
+        </property>
+        <property name="geometry">
+            <rect>
+                <x>0</x>
+                <y>0</y>
+                <width>500</width>
+                <height>400</height>
+            </rect>
+        </property>
+        <widget class="QWidget">
+            <property name="name">
+                <cstring>MotClef</cstring>
+            </property>
+            <attribute name="title">
+                <string>Ajouter Mot-Clef</string>
+            </attribute>
+            <widget class="QLabel">
+                <property name="name">
+                    <cstring>textLabel1_2</cstring>
+                </property>
+                <property name="geometry">
+                    <rect>
+                        <x>360</x>
+                        <y>0</y>
+                        <width>50</width>
+                        <height>37</height>
+                    </rect>
+                </property>
+                <property name="text">
+                    <string>&lt;h3&gt;&lt;p align="center"&gt;&lt;u&gt;&lt;b&gt;Régles&lt;/b&gt;&lt;/u&gt;&lt;/p&gt;&lt;/h3&gt;</string>
+                </property>
+            </widget>
+            <widget class="QListBox">
+                <property name="name">
+                    <cstring>LBMCPermis</cstring>
+                </property>
+                <property name="geometry">
+                    <rect>
+                        <x>10</x>
+                        <y>40</y>
+                        <width>220</width>
+                        <height>290</height>
+                    </rect>
+                </property>
+                <property name="minimumSize">
+                    <size>
+                        <width>0</width>
+                        <height>0</height>
+                    </size>
+                </property>
+            </widget>
+            <widget class="QListBox">
+                <property name="name">
+                    <cstring>LBRegles</cstring>
+                </property>
+                <property name="geometry">
+                    <rect>
+                        <x>260</x>
+                        <y>40</y>
+                        <width>230</width>
+                        <height>290</height>
+                    </rect>
+                </property>
+            </widget>
+            <widget class="QLabel">
+                <property name="name">
+                    <cstring>textLabel1</cstring>
+                </property>
+                <property name="geometry">
+                    <rect>
+                        <x>50</x>
+                        <y>10</y>
+                        <width>120</width>
+                        <height>20</height>
+                    </rect>
+                </property>
+                <property name="minimumSize">
+                    <size>
+                        <width>0</width>
+                        <height>0</height>
+                    </size>
+                </property>
+                <property name="text">
+                    <string>&lt;h3&gt;&lt;p align="center"&gt;&lt;u&gt;&lt;b&gt;Mots Clefs Permis&lt;/b&gt;&lt;/u&gt;&lt;/p&gt;&lt;/h3&gt;</string>
+                </property>
+            </widget>
+        </widget>
+        <widget class="QWidget">
+            <property name="name">
+                <cstring>Commande</cstring>
+            </property>
+            <attribute name="title">
+                <string>Nouvelle Commande</string>
+            </attribute>
+            <widget class="QLabel">
+                <property name="name">
+                    <cstring>textLabel6</cstring>
+                </property>
+                <property name="geometry">
+                    <rect>
+                        <x>10</x>
+                        <y>60</y>
+                        <width>60</width>
+                        <height>30</height>
+                    </rect>
+                </property>
+                <property name="text">
+                    <string>Filtre</string>
+                </property>
+            </widget>
+            <widget class="QLabel">
+                <property name="name">
+                    <cstring>textLabel4</cstring>
+                </property>
+                <property name="geometry">
+                    <rect>
+                        <x>90</x>
+                        <y>340</y>
+                        <width>300</width>
+                        <height>30</height>
+                    </rect>
+                </property>
+                <property name="text">
+                    <string>La commande choisie sera ajoutée APRES la commande courante</string>
+                </property>
+            </widget>
+            <widget class="QListBox">
+                <property name="name">
+                    <cstring>LBNouvCommande</cstring>
+                </property>
+                <property name="geometry">
+                    <rect>
+                        <x>50</x>
+                        <y>100</y>
+                        <width>410</width>
+                        <height>240</height>
+                    </rect>
+                </property>
+            </widget>
+            <widget class="QButtonGroup">
+                <property name="name">
+                    <cstring>buttonGroup1</cstring>
+                </property>
+                <property name="geometry">
+                    <rect>
+                        <x>300</x>
+                        <y>20</y>
+                        <width>151</width>
+                        <height>70</height>
+                    </rect>
+                </property>
+                <property name="title">
+                    <string>Affichage</string>
+                </property>
+                <widget class="QRadioButton">
+                    <property name="name">
+                        <cstring>RBGroupe</cstring>
+                    </property>
+                    <property name="geometry">
+                        <rect>
+                            <x>20</x>
+                            <y>40</y>
+                            <width>101</width>
+                            <height>20</height>
+                        </rect>
+                    </property>
+                    <property name="text">
+                        <string>par groupe</string>
+                    </property>
+                </widget>
+                <widget class="QRadioButton">
+                    <property name="name">
+                        <cstring>RBalpha</cstring>
+                    </property>
+                    <property name="geometry">
+                        <rect>
+                            <x>20</x>
+                            <y>20</y>
+                            <width>101</width>
+                            <height>20</height>
+                        </rect>
+                    </property>
+                    <property name="text">
+                        <string>alphabétique</string>
+                    </property>
+                    <property name="checked">
+                        <bool>true</bool>
+                    </property>
+                </widget>
+            </widget>
+            <widget class="QLineEdit">
+                <property name="name">
+                    <cstring>LEFiltre</cstring>
+                </property>
+                <property name="geometry">
+                    <rect>
+                        <x>50</x>
+                        <y>60</y>
+                        <width>160</width>
+                        <height>30</height>
+                    </rect>
+                </property>
+            </widget>
+            <widget class="QLabel">
+                <property name="name">
+                    <cstring>textLabel1_4</cstring>
+                </property>
+                <property name="geometry">
+                    <rect>
+                        <x>50</x>
+                        <y>20</y>
+                        <width>171</width>
+                        <height>21</height>
+                    </rect>
+                </property>
+                <property name="text">
+                    <string>&lt;b&gt;&lt;u&gt;Commandes :&lt;/u&gt;&lt;/b&gt;</string>
+                </property>
+            </widget>
+            <widget class="QToolButton">
+                <property name="name">
+                    <cstring>BNext</cstring>
+                </property>
+                <property name="geometry">
+                    <rect>
+                        <x>220</x>
+                        <y>60</y>
+                        <width>30</width>
+                        <height>31</height>
+                    </rect>
+                </property>
+                <property name="text">
+                    <string></string>
+                </property>
+                <property name="iconSet">
+                    <iconset>image0</iconset>
+                </property>
+                <property name="toolTip" stdset="0">
+                    <string>affiche la prochaine occurence</string>
+                </property>
+            </widget>
+        </widget>
+    </widget>
+</widget>
+<images>
+    <image name="image0">
+        <data format="PNG" length="264">89504e470d0a1a0a0000000d49484452000000210000000e0806000000a11e758c000000cf49444154388dd594db0ec3200c43edfdf8d897bb0f345b480845d51eb64888f412e76001c00f046fd6e99bba77200480924a1032c92efbd8c7d5cabcc025400099e957849568fe7f06c0ded1deb32b4a1ec4ea824b9e74097165bd01f85527f78a7201e0a3129f345a017c543bafdc983d0f7109d15a331b471f47072c17494a82338f6178203a8817e67306b1f08b07ba03e602c9b831077e37e0209e67e3386710977b17de80c185ad38695a51d522c82ce77912e2fed8be83762092f52b1820dd11bb10e565b53a5a3bbaff130713d66fa6981857060000000049454e44ae426082</data>
+    </image>
+</images>
+<connections>
+    <connection>
+        <sender>LBNouvCommande</sender>
+        <signal>clicked(QListBoxItem*)</signal>
+        <receiver>DMacro</receiver>
+        <slot>LBNouvCommandeClicked()</slot>
+    </connection>
+    <connection>
+        <sender>LEFiltre</sender>
+        <signal>textChanged(const QString&amp;)</signal>
+        <receiver>DMacro</receiver>
+        <slot>LEFiltreTextChanged()</slot>
+    </connection>
+    <connection>
+        <sender>LEFiltre</sender>
+        <signal>returnPressed()</signal>
+        <receiver>DMacro</receiver>
+        <slot>LEfiltreReturnPressed()</slot>
+    </connection>
+    <connection>
+        <sender>bSup</sender>
+        <signal>pressed()</signal>
+        <receiver>DMacro</receiver>
+        <slot>BSupPressed()</slot>
+    </connection>
+    <connection>
+        <sender>bOk</sender>
+        <signal>clicked()</signal>
+        <receiver>DMacro</receiver>
+        <slot>BOkPressed()</slot>
+    </connection>
+    <connection>
+        <sender>RBalpha</sender>
+        <signal>clicked()</signal>
+        <receiver>DMacro</receiver>
+        <slot>BuildTabCommand()</slot>
+    </connection>
+    <connection>
+        <sender>RBGroupe</sender>
+        <signal>clicked()</signal>
+        <receiver>DMacro</receiver>
+        <slot>BuildTabCommand()</slot>
+    </connection>
+    <connection>
+        <sender>BNext</sender>
+        <signal>clicked()</signal>
+        <receiver>DMacro</receiver>
+        <slot>BNextPressed()</slot>
+    </connection>
+</connections>
+<slots>
+    <slot>LBNouvCommandeClicked()</slot>
+    <slot>LEFiltreTextChanged()</slot>
+    <slot>LEfiltreReturnPressed()</slot>
+    <slot>BSupPressed()</slot>
+    <slot>BOkPressed()</slot>
+    <slot>BuildTabCommand()</slot>
+    <slot>BNextPressed()</slot>
+</slots>
+<layoutdefaults spacing="6" margin="11"/>
+</UI>
diff --git a/Ui/desPlusieursBase.py b/Ui/desPlusieursBase.py
new file mode 100644 (file)
index 0000000..b24626f
--- /dev/null
@@ -0,0 +1,194 @@
+# -*- coding: utf-8 -*-
+
+# Form implementation generated from reading ui file 'desPlusieursBase.ui'
+#
+# Created: lun avr 23 09:30:04 2007
+#      by: The PyQt User Interface Compiler (pyuic) 3.13
+#
+# WARNING! All changes made in this file will be lost!
+
+
+from qt import *
+
+image0_data = \
+    "\x89\x50\x4e\x47\x0d\x0a\x1a\x0a\x00\x00\x00\x0d" \
+    "\x49\x48\x44\x52\x00\x00\x00\x21\x00\x00\x00\x0e" \
+    "\x08\x06\x00\x00\x00\xa1\x1e\x75\x8c\x00\x00\x00" \
+    "\xc7\x49\x44\x41\x54\x38\x8d\xcd\x94\x59\x0e\xc3" \
+    "\x20\x0c\x44\x71\xd5\x7b\xc7\x3d\xf9\xf4\x07\xd3" \
+    "\x31\xb1\x59\xa2\x28\xaa\x25\x44\x48\xbc\x3c\xc6" \
+    "\x81\x52\xfe\xc0\xe4\x42\x0c\xee\xce\xb9\x12\xe0" \
+    "\x8a\x02\x39\x83\x88\x48\xf5\xdf\x02\xc9\x9c\x11" \
+    "\xf8\x60\x04\x30\x01\x19\x05\x4a\xe8\x68\xc5\x6a" \
+    "\xc2\x06\xc0\x6b\x4b\x10\x91\x11\xc8\x02\x87\x4f" \
+    "\x3a\x52\xa5\x87\x75\x71\x23\x89\x7e\x40\x39\xc4" \
+    "\x6b\x50\xd8\x86\x5b\x07\xf5\x40\x0a\x45\x00\x53" \
+    "\x33\x08\x93\xcf\x86\x74\xa3\x00\x28\xd4\x92\xde" \
+    "\xef\x04\x62\x6b\x55\x9d\xfe\x48\xac\x84\x2b\x1a" \
+    "\x6d\xaa\xe6\x85\x01\x55\x03\x3b\x99\xc5\x00\x9f" \
+    "\x70\xce\xda\x11\x1a\xab\x41\x3b\x6f\x6a\x70\xd1" \
+    "\x18\xe0\x08\xe6\xfd\x8b\xc5\x1d\x5d\x00\xa0\xf6" \
+    "\x14\x55\x6d\x1f\xf9\xb9\xbe\x49\x52\xaa\xbc\x37" \
+    "\x21\xf8\xf8\xb6\xf6\x24\xc5\x57\xef\x89\x47\xaf" \
+    "\xed\xf4\x8c\x5e\x60\xb8\xdf\xbe\xb8\x1d\x6d\xab" \
+    "\x9a\xff\x99\x27\x00\x00\x00\x00\x49\x45\x4e\x44" \
+    "\xae\x42\x60\x82"
+image1_data = \
+    "\x89\x50\x4e\x47\x0d\x0a\x1a\x0a\x00\x00\x00\x0d" \
+    "\x49\x48\x44\x52\x00\x00\x00\x21\x00\x00\x00\x0e" \
+    "\x08\x06\x00\x00\x00\xa1\x1e\x75\x8c\x00\x00\x00" \
+    "\xcf\x49\x44\x41\x54\x38\x8d\xd5\x94\xdb\x0e\xc3" \
+    "\x20\x0c\x43\xed\xfd\xf8\xd8\x97\xbb\x0f\x34\x5b" \
+    "\x48\x08\x45\xd5\x1e\xb6\x48\x88\xf4\x12\xe7\x60" \
+    "\x01\xc0\x0f\x04\x6f\xd6\xe9\x9b\xba\x77\x20\x04" \
+    "\x80\x92\x4a\x10\x32\xc9\x2e\xfb\xd8\xc7\xd5\xca" \
+    "\xbc\xc0\x25\x40\x00\x99\xe9\x57\x84\x95\x68\xfe" \
+    "\x7f\x06\xc0\xde\xd1\xde\xb3\x2b\x4a\x1e\xc4\xea" \
+    "\x82\x4b\x9e\x74\x09\x71\x65\xbd\x01\xf8\x55\x27" \
+    "\xf7\x8a\x72\x01\xe0\xa3\x12\x9f\x34\x5a\x01\x7c" \
+    "\x54\x3b\xaf\xdc\x98\x3d\x0f\x71\x09\xd1\x5a\x33" \
+    "\x1b\x47\x1f\x47\x07\x2c\x17\x49\x4a\x82\x33\x8f" \
+    "\x61\x78\x20\x3a\x88\x17\xe6\x73\x06\xb1\xf0\x8b" \
+    "\x07\xba\x03\xe6\x02\xc9\xb8\x31\x07\x7e\x37\xe0" \
+    "\x20\x9e\x67\xe3\x38\x67\x10\x97\x7b\x17\xde\x80" \
+    "\xc1\x85\xad\x38\x69\x5a\x51\xd5\x22\xc8\x2c\xe7" \
+    "\x79\x12\xe2\xfe\xd8\xbe\x83\x76\x20\x92\xf5\x2b" \
+    "\x18\x20\xdd\x11\xbb\x10\xe5\x65\xb5\x3a\x5a\x3b" \
+    "\xba\xff\x13\x07\x13\xd6\x6f\xa6\x98\x18\x57\x06" \
+    "\x00\x00\x00\x00\x49\x45\x4e\x44\xae\x42\x60\x82"
+
+class DPlusBase(QWidget):
+    def __init__(self,parent = None,name = None,fl = 0):
+        QWidget.__init__(self,parent,name,fl)
+
+        self.image0 = QPixmap()
+        self.image0.loadFromData(image0_data,"PNG")
+        self.image1 = QPixmap()
+        self.image1.loadFromData(image1_data,"PNG")
+        if not name:
+            self.setName("DPlusBase")
+
+        self.setMinimumSize(QSize(350,0))
+
+
+        self.tabuniqueinto = QTabWidget(self,"tabuniqueinto")
+        self.tabuniqueinto.setGeometry(QRect(20,20,450,440))
+
+        self.Widget8 = QWidget(self.tabuniqueinto,"Widget8")
+
+        self.bHelp = QPushButton(self.Widget8,"bHelp")
+        self.bHelp.setGeometry(QRect(0,370,142,30))
+        self.bHelp.setAutoDefault(1)
+
+        self.bOk = QPushButton(self.Widget8,"bOk")
+        self.bOk.setGeometry(QRect(150,370,142,30))
+        self.bOk.setAutoDefault(1)
+        self.bOk.setDefault(1)
+
+        self.bSup = QPushButton(self.Widget8,"bSup")
+        self.bSup.setGeometry(QRect(300,370,142,30))
+        self.bSup.setAutoDefault(1)
+
+        self.bParam = QPushButton(self.Widget8,"bParam")
+        self.bParam.setGeometry(QRect(290,240,142,30))
+        self.bParam.setAutoDefault(1)
+
+        self.bImport = QPushButton(self.Widget8,"bImport")
+        self.bImport.setGeometry(QRect(290,280,142,30))
+        self.bImport.setAutoDefault(1)
+
+        self.Commentaire = QLabel(self.Widget8,"Commentaire")
+        self.Commentaire.setGeometry(QRect(38,337,381,20))
+
+        self.textLabel1 = QLabel(self.Widget8,"textLabel1")
+        self.textLabel1.setGeometry(QRect(40,20,120,21))
+
+        self.textLabel1_2 = QLabel(self.Widget8,"textLabel1_2")
+        self.textLabel1_2.setGeometry(QRect(330,80,45,21))
+
+        self.BAjout1Val = QToolButton(self.Widget8,"BAjout1Val")
+        self.BAjout1Val.setGeometry(QRect(230,120,40,31))
+        self.BAjout1Val.setIconSet(QIconSet(self.image0))
+
+        self.BSup1Val = QToolButton(self.Widget8,"BSup1Val")
+        self.BSup1Val.setGeometry(QRect(230,80,40,31))
+        self.BSup1Val.setIconSet(QIconSet(self.image1))
+
+        self.LBValeurs = QListBox(self.Widget8,"LBValeurs")
+        self.LBValeurs.setGeometry(QRect(20,50,180,280))
+
+        self.LEValeur = QLineEdit(self.Widget8,"LEValeur")
+        self.LEValeur.setGeometry(QRect(280,110,150,30))
+        self.tabuniqueinto.insertTab(self.Widget8,QString(""))
+
+        self.languageChange()
+
+        self.resize(QSize(482,480).expandedTo(self.minimumSizeHint()))
+        self.clearWState(Qt.WState_Polished)
+
+        self.connect(self.bHelp,SIGNAL("clicked()"),self.ViewDoc)
+        self.connect(self.bOk,SIGNAL("clicked()"),self.BOkPourListePressed)
+        self.connect(self.bSup,SIGNAL("clicked()"),self.BSupPressed)
+        self.connect(self.bParam,SIGNAL("clicked()"),self.BParametresPressed)
+        self.connect(self.bImport,SIGNAL("clicked()"),self.BImportPressed)
+        self.connect(self.BAjout1Val,SIGNAL("clicked()"),self.Ajout1Valeur)
+        self.connect(self.BSup1Val,SIGNAL("clicked()"),self.Sup1Valeur)
+        self.connect(self.LEValeur,SIGNAL("returnPressed()"),self.LEValeurPressed)
+
+
+    def languageChange(self):
+        self.setCaption(self.__tr("DUnIn"))
+        self.bHelp.setText(self.__tr("&Documentation"))
+        self.bHelp.setAccel(self.__tr("Alt+D"))
+        QToolTip.add(self.bHelp,self.__tr("affichage documentation aster"))
+        self.bOk.setText(self.__tr("&Valider"))
+        self.bOk.setAccel(self.__tr("Shift+A, Alt+A, Alt+A, Alt+A"))
+        QToolTip.add(self.bOk,self.__tr("validation de la saisie"))
+        self.bSup.setText(self.__tr("&Supprimer"))
+        self.bSup.setAccel(self.__tr("Alt+S"))
+        QToolTip.add(self.bSup,self.__tr("suppression du mot clef"))
+        self.bParam.setText(self.__tr("&Parametres"))
+        self.bParam.setAccel(self.__tr("Alt+P"))
+        QToolTip.add(self.bParam,self.__tr("suppression du mot clef"))
+        self.bImport.setText(self.__tr("&Importer"))
+        self.bImport.setAccel(self.__tr("Alt+I"))
+        QToolTip.add(self.bImport,self.__tr("suppression du mot clef"))
+        self.Commentaire.setText(QString.null)
+        self.textLabel1.setText(self.__tr("<u><font size=\"+1\">Valeur(s) actuelle(s)</font></u>"))
+        self.textLabel1_2.setText(self.__tr("<font size=\"+1\">Valeur</font>"))
+        self.BAjout1Val.setText(QString.null)
+        QToolTip.add(self.BAjout1Val,self.__trUtf8("\x61\x6a\x6f\x75\x74\x65\x20\x6c\x61\x20\x76\x61\x6c\x65\x75\x72\x20\x73\x61\x69\x73\x69\x65\x20\x73\x6f\x75\x73\x20\x6c\x20\x6f\x63\x63\x75\x72\x65\x6e\x63\x65\x20\x73\x65\x6c\x65\x63\x74\x69\x6f\x6e\x6e\xc3\xa9\x65\x20\x28\x65\x6e\x20\x66\x69\x6e\x20\x64\x65\x20\x6c\x69\x73\x74\x65\x20\x73\x69\x20\x69\x6c\x20\x6e\x20\x79\x20\x61\x20\x70\x61\x73\x20\x64\x65\x20\x73\x65\x6c\x65\x63\x74\x69\x6f\x6e\x29"))
+        self.BSup1Val.setText(QString.null)
+        QToolTip.add(self.BSup1Val,self.__tr("enleve l occurence selectionnee"))
+        self.tabuniqueinto.changeTab(self.Widget8,self.__tr("Saisir Valeur"))
+
+
+    def BSupPressed(self):
+        print "DPlusBase.BSupPressed(): Not implemented yet"
+
+    def ViewDoc(self):
+        print "DPlusBase.ViewDoc(): Not implemented yet"
+
+    def BOkPourListePressed(self):
+        print "DPlusBase.BOkPourListePressed(): Not implemented yet"
+
+    def BParametresPressed(self):
+        print "DPlusBase.BParametresPressed(): Not implemented yet"
+
+    def LEValeurPressed(self):
+        print "DPlusBase.LEValeurPressed(): Not implemented yet"
+
+    def Ajout1Valeur(self):
+        print "DPlusBase.Ajout1Valeur(): Not implemented yet"
+
+    def Sup1Valeur(self):
+        print "DPlusBase.Sup1Valeur(): Not implemented yet"
+
+    def BImportPressed(self):
+        print "DPlusBase.BImportPressed(): Not implemented yet"
+
+    def __tr(self,s,c = None):
+        return qApp.translate("DPlusBase",s,c)
+
+    def __trUtf8(self,s,c = None):
+        return qApp.translate("DPlusBase",s,c,QApplication.UnicodeUTF8)
diff --git a/Ui/desPlusieursBase.ui b/Ui/desPlusieursBase.ui
new file mode 100644 (file)
index 0000000..a54a7d8
--- /dev/null
@@ -0,0 +1,361 @@
+<!DOCTYPE UI><UI version="3.3" stdsetdef="1">
+<class>DPlusBase</class>
+<widget class="QWidget">
+    <property name="name">
+        <cstring>DPlusBase</cstring>
+    </property>
+    <property name="geometry">
+        <rect>
+            <x>0</x>
+            <y>0</y>
+            <width>482</width>
+            <height>480</height>
+        </rect>
+    </property>
+    <property name="minimumSize">
+        <size>
+            <width>350</width>
+            <height>0</height>
+        </size>
+    </property>
+    <property name="caption">
+        <string>DUnIn</string>
+    </property>
+    <widget class="QTabWidget">
+        <property name="name">
+            <cstring>tabuniqueinto</cstring>
+        </property>
+        <property name="geometry">
+            <rect>
+                <x>20</x>
+                <y>20</y>
+                <width>450</width>
+                <height>440</height>
+            </rect>
+        </property>
+        <widget class="QWidget">
+            <property name="name">
+                <cstring>Widget8</cstring>
+            </property>
+            <attribute name="title">
+                <string>Saisir Valeur</string>
+            </attribute>
+            <widget class="QPushButton">
+                <property name="name">
+                    <cstring>bHelp</cstring>
+                </property>
+                <property name="geometry">
+                    <rect>
+                        <x>0</x>
+                        <y>370</y>
+                        <width>142</width>
+                        <height>30</height>
+                    </rect>
+                </property>
+                <property name="text">
+                    <string>&amp;Documentation</string>
+                </property>
+                <property name="accel">
+                    <string>Alt+D</string>
+                </property>
+                <property name="autoDefault">
+                    <bool>true</bool>
+                </property>
+                <property name="toolTip" stdset="0">
+                    <string>affichage documentation aster</string>
+                </property>
+            </widget>
+            <widget class="QPushButton">
+                <property name="name">
+                    <cstring>bOk</cstring>
+                </property>
+                <property name="geometry">
+                    <rect>
+                        <x>150</x>
+                        <y>370</y>
+                        <width>142</width>
+                        <height>30</height>
+                    </rect>
+                </property>
+                <property name="text">
+                    <string>&amp;Valider</string>
+                </property>
+                <property name="accel">
+                    <string>Shift+A, Alt+A, Alt+A, Alt+A</string>
+                </property>
+                <property name="autoDefault">
+                    <bool>true</bool>
+                </property>
+                <property name="default">
+                    <bool>true</bool>
+                </property>
+                <property name="toolTip" stdset="0">
+                    <string>validation de la saisie</string>
+                </property>
+            </widget>
+            <widget class="QPushButton">
+                <property name="name">
+                    <cstring>bSup</cstring>
+                </property>
+                <property name="geometry">
+                    <rect>
+                        <x>300</x>
+                        <y>370</y>
+                        <width>142</width>
+                        <height>30</height>
+                    </rect>
+                </property>
+                <property name="text">
+                    <string>&amp;Supprimer</string>
+                </property>
+                <property name="accel">
+                    <string>Alt+S</string>
+                </property>
+                <property name="autoDefault">
+                    <bool>true</bool>
+                </property>
+                <property name="toolTip" stdset="0">
+                    <string>suppression du mot clef</string>
+                </property>
+            </widget>
+            <widget class="QPushButton">
+                <property name="name">
+                    <cstring>bParam</cstring>
+                </property>
+                <property name="geometry">
+                    <rect>
+                        <x>290</x>
+                        <y>240</y>
+                        <width>142</width>
+                        <height>30</height>
+                    </rect>
+                </property>
+                <property name="text">
+                    <string>&amp;Parametres</string>
+                </property>
+                <property name="accel">
+                    <string>Alt+P</string>
+                </property>
+                <property name="autoDefault">
+                    <bool>true</bool>
+                </property>
+                <property name="toolTip" stdset="0">
+                    <string>suppression du mot clef</string>
+                </property>
+            </widget>
+            <widget class="QPushButton">
+                <property name="name">
+                    <cstring>bImport</cstring>
+                </property>
+                <property name="geometry">
+                    <rect>
+                        <x>290</x>
+                        <y>280</y>
+                        <width>142</width>
+                        <height>30</height>
+                    </rect>
+                </property>
+                <property name="text">
+                    <string>&amp;Importer</string>
+                </property>
+                <property name="accel">
+                    <string>Alt+I</string>
+                </property>
+                <property name="autoDefault">
+                    <bool>true</bool>
+                </property>
+                <property name="toolTip" stdset="0">
+                    <string>suppression du mot clef</string>
+                </property>
+            </widget>
+            <widget class="QLabel">
+                <property name="name">
+                    <cstring>Commentaire</cstring>
+                </property>
+                <property name="geometry">
+                    <rect>
+                        <x>38</x>
+                        <y>337</y>
+                        <width>381</width>
+                        <height>20</height>
+                    </rect>
+                </property>
+                <property name="text">
+                    <string></string>
+                </property>
+            </widget>
+            <widget class="QLabel">
+                <property name="name">
+                    <cstring>textLabel1</cstring>
+                </property>
+                <property name="geometry">
+                    <rect>
+                        <x>40</x>
+                        <y>20</y>
+                        <width>120</width>
+                        <height>21</height>
+                    </rect>
+                </property>
+                <property name="text">
+                    <string>&lt;u&gt;&lt;font size="+1"&gt;Valeur(s) actuelle(s)&lt;/font&gt;&lt;/u&gt;</string>
+                </property>
+            </widget>
+            <widget class="QLabel">
+                <property name="name">
+                    <cstring>textLabel1_2</cstring>
+                </property>
+                <property name="geometry">
+                    <rect>
+                        <x>330</x>
+                        <y>80</y>
+                        <width>45</width>
+                        <height>21</height>
+                    </rect>
+                </property>
+                <property name="text">
+                    <string>&lt;font size="+1"&gt;Valeur&lt;/font&gt;</string>
+                </property>
+            </widget>
+            <widget class="QToolButton">
+                <property name="name">
+                    <cstring>BAjout1Val</cstring>
+                </property>
+                <property name="geometry">
+                    <rect>
+                        <x>230</x>
+                        <y>120</y>
+                        <width>40</width>
+                        <height>31</height>
+                    </rect>
+                </property>
+                <property name="text">
+                    <string></string>
+                </property>
+                <property name="iconSet">
+                    <iconset>image0</iconset>
+                </property>
+                <property name="toolTip" stdset="0">
+                    <string>ajoute la valeur saisie sous l occurence selectionnée (en fin de liste si il n y a pas de selection)</string>
+                </property>
+            </widget>
+            <widget class="QToolButton">
+                <property name="name">
+                    <cstring>BSup1Val</cstring>
+                </property>
+                <property name="geometry">
+                    <rect>
+                        <x>230</x>
+                        <y>80</y>
+                        <width>40</width>
+                        <height>31</height>
+                    </rect>
+                </property>
+                <property name="text">
+                    <string></string>
+                </property>
+                <property name="iconSet">
+                    <iconset>image1</iconset>
+                </property>
+                <property name="toolTip" stdset="0">
+                    <string>enleve l occurence selectionnee</string>
+                </property>
+            </widget>
+            <widget class="QListBox">
+                <property name="name">
+                    <cstring>LBValeurs</cstring>
+                </property>
+                <property name="geometry">
+                    <rect>
+                        <x>20</x>
+                        <y>50</y>
+                        <width>180</width>
+                        <height>280</height>
+                    </rect>
+                </property>
+            </widget>
+            <widget class="QLineEdit">
+                <property name="name">
+                    <cstring>LEValeur</cstring>
+                </property>
+                <property name="geometry">
+                    <rect>
+                        <x>280</x>
+                        <y>110</y>
+                        <width>150</width>
+                        <height>30</height>
+                    </rect>
+                </property>
+            </widget>
+        </widget>
+    </widget>
+</widget>
+<images>
+    <image name="image0">
+        <data format="PNG" length="256">89504e470d0a1a0a0000000d49484452000000210000000e0806000000a11e758c000000c749444154388dcd94590ec3200c4471d57bc73df9f407d331b159a228aa254448bc3cc68152fec0e4420ceeceb912e08a0239838848f5df02c99c11f86004300119054ae868c56ac206c06b4b109111c802874f3a52a587757123897e4039c46b50d8865b07f5400a450053330893cf8674a30028d492deef04626b559dfe48ac842b1a6daae6850155033b99c5009f70ceda111aab413b6f6a70d118e008e6fd8bc51d5d00a0f614556d1ff9b9be4952aabc3721f8f8b6f624c557ef8947afedf48c5e60b8dfbeb81d6dab9aff99270000000049454e44ae426082</data>
+    </image>
+    <image name="image1">
+        <data format="PNG" length="264">89504e470d0a1a0a0000000d49484452000000210000000e0806000000a11e758c000000cf49444154388dd594db0ec3200c43edfdf8d897bb0f345b480845d51eb64888f412e76001c00f046fd6e99bba77200480924a1032c92efbd8c7d5cabcc025400099e957849568fe7f06c0ded1deb32b4a1ec4ea824b9e74097165bd01f85527f78a7201e0a3129f345a017c543bafdc983d0f7109d15a331b471f47072c17494a82338f6178203a8817e67306b1f08b07ba03e602c9b831077e37e0209e67e3386710977b17de80c185ad38695a51d522c82ce77912e2fed8be83762092f52b1820dd11bb10e565b53a5a3bbaff130713d66fa6981857060000000049454e44ae426082</data>
+    </image>
+</images>
+<connections>
+    <connection>
+        <sender>bHelp</sender>
+        <signal>clicked()</signal>
+        <receiver>DPlusBase</receiver>
+        <slot>ViewDoc()</slot>
+    </connection>
+    <connection>
+        <sender>bOk</sender>
+        <signal>clicked()</signal>
+        <receiver>DPlusBase</receiver>
+        <slot>BOkPourListePressed()</slot>
+    </connection>
+    <connection>
+        <sender>bSup</sender>
+        <signal>clicked()</signal>
+        <receiver>DPlusBase</receiver>
+        <slot>BSupPressed()</slot>
+    </connection>
+    <connection>
+        <sender>bParam</sender>
+        <signal>clicked()</signal>
+        <receiver>DPlusBase</receiver>
+        <slot>BParametresPressed()</slot>
+    </connection>
+    <connection>
+        <sender>bImport</sender>
+        <signal>clicked()</signal>
+        <receiver>DPlusBase</receiver>
+        <slot>BImportPressed()</slot>
+    </connection>
+    <connection>
+        <sender>BAjout1Val</sender>
+        <signal>clicked()</signal>
+        <receiver>DPlusBase</receiver>
+        <slot>Ajout1Valeur()</slot>
+    </connection>
+    <connection>
+        <sender>BSup1Val</sender>
+        <signal>clicked()</signal>
+        <receiver>DPlusBase</receiver>
+        <slot>Sup1Valeur()</slot>
+    </connection>
+    <connection>
+        <sender>LEValeur</sender>
+        <signal>returnPressed()</signal>
+        <receiver>DPlusBase</receiver>
+        <slot>LEValeurPressed()</slot>
+    </connection>
+</connections>
+<slots>
+    <slot>BSupPressed()</slot>
+    <slot>ViewDoc()</slot>
+    <slot>BOkPourListePressed()</slot>
+    <slot>BParametresPressed()</slot>
+    <slot>LEValeurPressed()</slot>
+    <slot>Ajout1Valeur()</slot>
+    <slot>Sup1Valeur()</slot>
+    <slot>BImportPressed()</slot>
+</slots>
+<layoutdefaults spacing="6" margin="11"/>
+</UI>
diff --git a/Ui/desPlusieursInto.py b/Ui/desPlusieursInto.py
new file mode 100644 (file)
index 0000000..c5c177b
--- /dev/null
@@ -0,0 +1,169 @@
+# -*- coding: utf-8 -*-
+
+# Form implementation generated from reading ui file 'desPlusieursInto.ui'
+#
+# Created: mer avr 25 09:04:00 2007
+#      by: The PyQt User Interface Compiler (pyuic) 3.13
+#
+# WARNING! All changes made in this file will be lost!
+
+
+from qt import *
+
+image0_data = \
+    "\x89\x50\x4e\x47\x0d\x0a\x1a\x0a\x00\x00\x00\x0d" \
+    "\x49\x48\x44\x52\x00\x00\x00\x21\x00\x00\x00\x0e" \
+    "\x08\x06\x00\x00\x00\xa1\x1e\x75\x8c\x00\x00\x00" \
+    "\xcf\x49\x44\x41\x54\x38\x8d\xd5\x94\xdb\x0e\xc3" \
+    "\x20\x0c\x43\xed\xfd\xf8\xd8\x97\xbb\x0f\x34\x5b" \
+    "\x48\x08\x45\xd5\x1e\xb6\x48\x88\xf4\x12\xe7\x60" \
+    "\x01\xc0\x0f\x04\x6f\xd6\xe9\x9b\xba\x77\x20\x04" \
+    "\x80\x92\x4a\x10\x32\xc9\x2e\xfb\xd8\xc7\xd5\xca" \
+    "\xbc\xc0\x25\x40\x00\x99\xe9\x57\x84\x95\x68\xfe" \
+    "\x7f\x06\xc0\xde\xd1\xde\xb3\x2b\x4a\x1e\xc4\xea" \
+    "\x82\x4b\x9e\x74\x09\x71\x65\xbd\x01\xf8\x55\x27" \
+    "\xf7\x8a\x72\x01\xe0\xa3\x12\x9f\x34\x5a\x01\x7c" \
+    "\x54\x3b\xaf\xdc\x98\x3d\x0f\x71\x09\xd1\x5a\x33" \
+    "\x1b\x47\x1f\x47\x07\x2c\x17\x49\x4a\x82\x33\x8f" \
+    "\x61\x78\x20\x3a\x88\x17\xe6\x73\x06\xb1\xf0\x8b" \
+    "\x07\xba\x03\xe6\x02\xc9\xb8\x31\x07\x7e\x37\xe0" \
+    "\x20\x9e\x67\xe3\x38\x67\x10\x97\x7b\x17\xde\x80" \
+    "\xc1\x85\xad\x38\x69\x5a\x51\xd5\x22\xc8\x2c\xe7" \
+    "\x79\x12\xe2\xfe\xd8\xbe\x83\x76\x20\x92\xf5\x2b" \
+    "\x18\x20\xdd\x11\xbb\x10\xe5\x65\xb5\x3a\x5a\x3b" \
+    "\xba\xff\x13\x07\x13\xd6\x6f\xa6\x98\x18\x57\x06" \
+    "\x00\x00\x00\x00\x49\x45\x4e\x44\xae\x42\x60\x82"
+image1_data = \
+    "\x89\x50\x4e\x47\x0d\x0a\x1a\x0a\x00\x00\x00\x0d" \
+    "\x49\x48\x44\x52\x00\x00\x00\x21\x00\x00\x00\x0e" \
+    "\x08\x06\x00\x00\x00\xa1\x1e\x75\x8c\x00\x00\x00" \
+    "\xc7\x49\x44\x41\x54\x38\x8d\xcd\x94\x59\x0e\xc3" \
+    "\x20\x0c\x44\x71\xd5\x7b\xc7\x3d\xf9\xf4\x07\xd3" \
+    "\x31\xb1\x59\xa2\x28\xaa\x25\x44\x48\xbc\x3c\xc6" \
+    "\x81\x52\xfe\xc0\xe4\x42\x0c\xee\xce\xb9\x12\xe0" \
+    "\x8a\x02\x39\x83\x88\x48\xf5\xdf\x02\xc9\x9c\x11" \
+    "\xf8\x60\x04\x30\x01\x19\x05\x4a\xe8\x68\xc5\x6a" \
+    "\xc2\x06\xc0\x6b\x4b\x10\x91\x11\xc8\x02\x87\x4f" \
+    "\x3a\x52\xa5\x87\x75\x71\x23\x89\x7e\x40\x39\xc4" \
+    "\x6b\x50\xd8\x86\x5b\x07\xf5\x40\x0a\x45\x00\x53" \
+    "\x33\x08\x93\xcf\x86\x74\xa3\x00\x28\xd4\x92\xde" \
+    "\xef\x04\x62\x6b\x55\x9d\xfe\x48\xac\x84\x2b\x1a" \
+    "\x6d\xaa\xe6\x85\x01\x55\x03\x3b\x99\xc5\x00\x9f" \
+    "\x70\xce\xda\x11\x1a\xab\x41\x3b\x6f\x6a\x70\xd1" \
+    "\x18\xe0\x08\xe6\xfd\x8b\xc5\x1d\x5d\x00\xa0\xf6" \
+    "\x14\x55\x6d\x1f\xf9\xb9\xbe\x49\x52\xaa\xbc\x37" \
+    "\x21\xf8\xf8\xb6\xf6\x24\xc5\x57\xef\x89\x47\xaf" \
+    "\xed\xf4\x8c\x5e\x60\xb8\xdf\xbe\xb8\x1d\x6d\xab" \
+    "\x9a\xff\x99\x27\x00\x00\x00\x00\x49\x45\x4e\x44" \
+    "\xae\x42\x60\x82"
+
+class DPlusInto(QWidget):
+    def __init__(self,parent = None,name = None,fl = 0):
+        QWidget.__init__(self,parent,name,fl)
+
+        self.image0 = QPixmap()
+        self.image0.loadFromData(image0_data,"PNG")
+        self.image1 = QPixmap()
+        self.image1.loadFromData(image1_data,"PNG")
+        if not name:
+            self.setName("DPlusInto")
+
+        self.setMinimumSize(QSize(350,0))
+
+
+        self.tabuniqueinto = QTabWidget(self,"tabuniqueinto")
+        self.tabuniqueinto.setGeometry(QRect(20,20,450,440))
+
+        self.Widget8 = QWidget(self.tabuniqueinto,"Widget8")
+
+        self.bHelp = QPushButton(self.Widget8,"bHelp")
+        self.bHelp.setGeometry(QRect(0,370,142,30))
+        self.bHelp.setAutoDefault(1)
+
+        self.bOk = QPushButton(self.Widget8,"bOk")
+        self.bOk.setGeometry(QRect(150,370,142,30))
+        self.bOk.setAutoDefault(1)
+        self.bOk.setDefault(1)
+
+        self.bSup = QPushButton(self.Widget8,"bSup")
+        self.bSup.setGeometry(QRect(300,370,142,30))
+        self.bSup.setAutoDefault(1)
+
+        self.LBValeurs = QListBox(self.Widget8,"LBValeurs")
+        self.LBValeurs.setGeometry(QRect(10,50,180,280))
+
+        self.BSup1Val = QToolButton(self.Widget8,"BSup1Val")
+        self.BSup1Val.setGeometry(QRect(200,70,40,31))
+        self.BSup1Val.setIconSet(QIconSet(self.image0))
+
+        self.BAjout1Val = QToolButton(self.Widget8,"BAjout1Val")
+        self.BAjout1Val.setGeometry(QRect(200,110,40,31))
+        self.BAjout1Val.setIconSet(QIconSet(self.image1))
+
+        self.textLabel1 = QLabel(self.Widget8,"textLabel1")
+        self.textLabel1.setGeometry(QRect(40,20,120,21))
+
+        self.textLabel1_2 = QLabel(self.Widget8,"textLabel1_2")
+        self.textLabel1_2.setGeometry(QRect(278,16,130,21))
+
+        self.Commentaire = QLabel(self.Widget8,"Commentaire")
+        self.Commentaire.setGeometry(QRect(30,340,381,20))
+
+        self.listBoxVal = QListBox(self.Widget8,"listBoxVal")
+        self.listBoxVal.setGeometry(QRect(250,50,180,280))
+        self.tabuniqueinto.insertTab(self.Widget8,QString(""))
+
+        self.languageChange()
+
+        self.resize(QSize(482,480).expandedTo(self.minimumSizeHint()))
+        self.clearWState(Qt.WState_Polished)
+
+        self.connect(self.bHelp,SIGNAL("clicked()"),self.ViewDoc)
+        self.connect(self.bOk,SIGNAL("clicked()"),self.BOkPourListePressed)
+        self.connect(self.bSup,SIGNAL("clicked()"),self.BSupPressed)
+        self.connect(self.LBValeurs,SIGNAL("doubleClicked(QListBoxItem*)"),self.Sup1Valeur)
+        self.connect(self.BAjout1Val,SIGNAL("clicked()"),self.Ajout1Valeur)
+        self.connect(self.BSup1Val,SIGNAL("clicked()"),self.Sup1Valeur)
+
+
+    def languageChange(self):
+        self.setCaption(self.__tr("DUnIn"))
+        self.bHelp.setText(self.__tr("&Documentation"))
+        self.bHelp.setAccel(self.__tr("Alt+D"))
+        QToolTip.add(self.bHelp,self.__tr("affichage documentation aster"))
+        self.bOk.setText(self.__tr("&Valider"))
+        self.bOk.setAccel(self.__tr("Shift+A, Alt+A, Alt+A, Alt+A"))
+        QToolTip.add(self.bOk,self.__tr("validation de la saisie"))
+        self.bSup.setText(self.__tr("&Supprimer"))
+        self.bSup.setAccel(self.__tr("Alt+S"))
+        QToolTip.add(self.bSup,self.__tr("suppression du mot clef"))
+        self.BSup1Val.setText(QString.null)
+        QToolTip.add(self.BSup1Val,self.__tr("enleve l occurence selectionnee"))
+        self.BAjout1Val.setText(QString.null)
+        QToolTip.add(self.BAjout1Val,self.__trUtf8("\x61\x6a\x6f\x75\x74\x65\x20\x6c\x61\x20\x76\x61\x6c\x65\x75\x72\x20\x73\x61\x69\x73\x69\x65\x20\x73\x6f\x75\x73\x20\x6c\x20\x6f\x63\x63\x75\x72\x65\x6e\x63\x65\x20\x73\x65\x6c\x65\x63\x74\x69\x6f\x6e\x6e\xc3\xa9\x65\x20\x28\x65\x6e\x20\x66\x69\x6e\x20\x64\x65\x20\x6c\x69\x73\x74\x65\x20\x73\x69\x20\x69\x6c\x20\x6e\x20\x79\x20\x61\x20\x70\x61\x73\x20\x64\x65\x20\x73\x65\x6c\x65\x63\x74\x69\x6f\x6e\x29"))
+        self.textLabel1.setText(self.__tr("<u><font size=\"+1\">Valeur(s) actuelle(s)</font></u>"))
+        self.textLabel1_2.setText(self.__tr("<u><font size=\"+1\">Valeur(s) possibles(s)</font></u>"))
+        self.Commentaire.setText(QString.null)
+        self.tabuniqueinto.changeTab(self.Widget8,self.__tr("Saisir Valeur"))
+
+
+    def BSupPressed(self):
+        print "DPlusInto.BSupPressed(): Not implemented yet"
+
+    def ViewDoc(self):
+        print "DPlusInto.ViewDoc(): Not implemented yet"
+
+    def BOkPourListePressed(self):
+        print "DPlusInto.BOkPourListePressed(): Not implemented yet"
+
+    def Ajout1Valeur(self):
+        print "DPlusInto.Ajout1Valeur(): Not implemented yet"
+
+    def Sup1Valeur(self):
+        print "DPlusInto.Sup1Valeur(): Not implemented yet"
+
+    def __tr(self,s,c = None):
+        return qApp.translate("DPlusInto",s,c)
+
+    def __trUtf8(self,s,c = None):
+        return qApp.translate("DPlusInto",s,c,QApplication.UnicodeUTF8)
diff --git a/Ui/desPlusieursInto.ui b/Ui/desPlusieursInto.ui
new file mode 100644 (file)
index 0000000..8ea0dcb
--- /dev/null
@@ -0,0 +1,296 @@
+<!DOCTYPE UI><UI version="3.3" stdsetdef="1">
+<class>DPlusInto</class>
+<widget class="QWidget">
+    <property name="name">
+        <cstring>DPlusInto</cstring>
+    </property>
+    <property name="geometry">
+        <rect>
+            <x>0</x>
+            <y>0</y>
+            <width>482</width>
+            <height>480</height>
+        </rect>
+    </property>
+    <property name="minimumSize">
+        <size>
+            <width>350</width>
+            <height>0</height>
+        </size>
+    </property>
+    <property name="caption">
+        <string>DUnIn</string>
+    </property>
+    <widget class="QTabWidget">
+        <property name="name">
+            <cstring>tabuniqueinto</cstring>
+        </property>
+        <property name="geometry">
+            <rect>
+                <x>20</x>
+                <y>20</y>
+                <width>450</width>
+                <height>440</height>
+            </rect>
+        </property>
+        <widget class="QWidget">
+            <property name="name">
+                <cstring>Widget8</cstring>
+            </property>
+            <attribute name="title">
+                <string>Saisir Valeur</string>
+            </attribute>
+            <widget class="QPushButton">
+                <property name="name">
+                    <cstring>bHelp</cstring>
+                </property>
+                <property name="geometry">
+                    <rect>
+                        <x>0</x>
+                        <y>370</y>
+                        <width>142</width>
+                        <height>30</height>
+                    </rect>
+                </property>
+                <property name="text">
+                    <string>&amp;Documentation</string>
+                </property>
+                <property name="accel">
+                    <string>Alt+D</string>
+                </property>
+                <property name="autoDefault">
+                    <bool>true</bool>
+                </property>
+                <property name="toolTip" stdset="0">
+                    <string>affichage documentation aster</string>
+                </property>
+            </widget>
+            <widget class="QPushButton">
+                <property name="name">
+                    <cstring>bOk</cstring>
+                </property>
+                <property name="geometry">
+                    <rect>
+                        <x>150</x>
+                        <y>370</y>
+                        <width>142</width>
+                        <height>30</height>
+                    </rect>
+                </property>
+                <property name="text">
+                    <string>&amp;Valider</string>
+                </property>
+                <property name="accel">
+                    <string>Shift+A, Alt+A, Alt+A, Alt+A</string>
+                </property>
+                <property name="autoDefault">
+                    <bool>true</bool>
+                </property>
+                <property name="default">
+                    <bool>true</bool>
+                </property>
+                <property name="toolTip" stdset="0">
+                    <string>validation de la saisie</string>
+                </property>
+            </widget>
+            <widget class="QPushButton">
+                <property name="name">
+                    <cstring>bSup</cstring>
+                </property>
+                <property name="geometry">
+                    <rect>
+                        <x>300</x>
+                        <y>370</y>
+                        <width>142</width>
+                        <height>30</height>
+                    </rect>
+                </property>
+                <property name="text">
+                    <string>&amp;Supprimer</string>
+                </property>
+                <property name="accel">
+                    <string>Alt+S</string>
+                </property>
+                <property name="autoDefault">
+                    <bool>true</bool>
+                </property>
+                <property name="toolTip" stdset="0">
+                    <string>suppression du mot clef</string>
+                </property>
+            </widget>
+            <widget class="QListBox">
+                <property name="name">
+                    <cstring>LBValeurs</cstring>
+                </property>
+                <property name="geometry">
+                    <rect>
+                        <x>10</x>
+                        <y>50</y>
+                        <width>180</width>
+                        <height>280</height>
+                    </rect>
+                </property>
+            </widget>
+            <widget class="QToolButton">
+                <property name="name">
+                    <cstring>BSup1Val</cstring>
+                </property>
+                <property name="geometry">
+                    <rect>
+                        <x>200</x>
+                        <y>70</y>
+                        <width>40</width>
+                        <height>31</height>
+                    </rect>
+                </property>
+                <property name="text">
+                    <string></string>
+                </property>
+                <property name="iconSet">
+                    <iconset>image0</iconset>
+                </property>
+                <property name="toolTip" stdset="0">
+                    <string>enleve l occurence selectionnee</string>
+                </property>
+            </widget>
+            <widget class="QToolButton">
+                <property name="name">
+                    <cstring>BAjout1Val</cstring>
+                </property>
+                <property name="geometry">
+                    <rect>
+                        <x>200</x>
+                        <y>110</y>
+                        <width>40</width>
+                        <height>31</height>
+                    </rect>
+                </property>
+                <property name="text">
+                    <string></string>
+                </property>
+                <property name="iconSet">
+                    <iconset>image1</iconset>
+                </property>
+                <property name="toolTip" stdset="0">
+                    <string>ajoute la valeur saisie sous l occurence selectionnée (en fin de liste si il n y a pas de selection)</string>
+                </property>
+            </widget>
+            <widget class="QLabel">
+                <property name="name">
+                    <cstring>textLabel1</cstring>
+                </property>
+                <property name="geometry">
+                    <rect>
+                        <x>40</x>
+                        <y>20</y>
+                        <width>120</width>
+                        <height>21</height>
+                    </rect>
+                </property>
+                <property name="text">
+                    <string>&lt;u&gt;&lt;font size="+1"&gt;Valeur(s) actuelle(s)&lt;/font&gt;&lt;/u&gt;</string>
+                </property>
+            </widget>
+            <widget class="QLabel">
+                <property name="name">
+                    <cstring>textLabel1_2</cstring>
+                </property>
+                <property name="geometry">
+                    <rect>
+                        <x>278</x>
+                        <y>16</y>
+                        <width>130</width>
+                        <height>21</height>
+                    </rect>
+                </property>
+                <property name="text">
+                    <string>&lt;u&gt;&lt;font size="+1"&gt;Valeur(s) possibles(s)&lt;/font&gt;&lt;/u&gt;</string>
+                </property>
+            </widget>
+            <widget class="QLabel">
+                <property name="name">
+                    <cstring>Commentaire</cstring>
+                </property>
+                <property name="geometry">
+                    <rect>
+                        <x>30</x>
+                        <y>340</y>
+                        <width>381</width>
+                        <height>20</height>
+                    </rect>
+                </property>
+                <property name="text">
+                    <string></string>
+                </property>
+            </widget>
+            <widget class="QListBox">
+                <property name="name">
+                    <cstring>listBoxVal</cstring>
+                </property>
+                <property name="geometry">
+                    <rect>
+                        <x>250</x>
+                        <y>50</y>
+                        <width>180</width>
+                        <height>280</height>
+                    </rect>
+                </property>
+            </widget>
+        </widget>
+    </widget>
+</widget>
+<images>
+    <image name="image0">
+        <data format="PNG" length="264">89504e470d0a1a0a0000000d49484452000000210000000e0806000000a11e758c000000cf49444154388dd594db0ec3200c43edfdf8d897bb0f345b480845d51eb64888f412e76001c00f046fd6e99bba77200480924a1032c92efbd8c7d5cabcc025400099e957849568fe7f06c0ded1deb32b4a1ec4ea824b9e74097165bd01f85527f78a7201e0a3129f345a017c543bafdc983d0f7109d15a331b471f47072c17494a82338f6178203a8817e67306b1f08b07ba03e602c9b831077e37e0209e67e3386710977b17de80c185ad38695a51d522c82ce77912e2fed8be83762092f52b1820dd11bb10e565b53a5a3bbaff130713d66fa6981857060000000049454e44ae426082</data>
+    </image>
+    <image name="image1">
+        <data format="PNG" length="256">89504e470d0a1a0a0000000d49484452000000210000000e0806000000a11e758c000000c749444154388dcd94590ec3200c4471d57bc73df9f407d331b159a228aa254448bc3cc68152fec0e4420ceeceb912e08a0239838848f5df02c99c11f86004300119054ae868c56ac206c06b4b109111c802874f3a52a587757123897e4039c46b50d8865b07f5400a450053330893cf8674a30028d492deef04626b559dfe48ac842b1a6daae6850155033b99c5009f70ceda111aab413b6f6a70d118e008e6fd8bc51d5d00a0f614556d1ff9b9be4952aabc3721f8f8b6f624c557ef8947afedf48c5e60b8dfbeb81d6dab9aff99270000000049454e44ae426082</data>
+    </image>
+</images>
+<connections>
+    <connection>
+        <sender>bHelp</sender>
+        <signal>clicked()</signal>
+        <receiver>DPlusInto</receiver>
+        <slot>ViewDoc()</slot>
+    </connection>
+    <connection>
+        <sender>bOk</sender>
+        <signal>clicked()</signal>
+        <receiver>DPlusInto</receiver>
+        <slot>BOkPourListePressed()</slot>
+    </connection>
+    <connection>
+        <sender>bSup</sender>
+        <signal>clicked()</signal>
+        <receiver>DPlusInto</receiver>
+        <slot>BSupPressed()</slot>
+    </connection>
+    <connection>
+        <sender>LBValeurs</sender>
+        <signal>doubleClicked(QListBoxItem*)</signal>
+        <receiver>DPlusInto</receiver>
+        <slot>Sup1Valeur()</slot>
+    </connection>
+    <connection>
+        <sender>BAjout1Val</sender>
+        <signal>clicked()</signal>
+        <receiver>DPlusInto</receiver>
+        <slot>Ajout1Valeur()</slot>
+    </connection>
+    <connection>
+        <sender>BSup1Val</sender>
+        <signal>clicked()</signal>
+        <receiver>DPlusInto</receiver>
+        <slot>Sup1Valeur()</slot>
+    </connection>
+</connections>
+<slots>
+    <slot>BSupPressed()</slot>
+    <slot>ViewDoc()</slot>
+    <slot>BOkPourListePressed()</slot>
+    <slot>Ajout1Valeur()</slot>
+    <slot>Sup1Valeur()</slot>
+</slots>
+<layoutdefaults spacing="6" margin="11"/>
+</UI>
diff --git a/Ui/desRacine.py b/Ui/desRacine.py
new file mode 100644 (file)
index 0000000..f82675b
--- /dev/null
@@ -0,0 +1,155 @@
+# -*- coding: utf-8 -*-
+
+# Form implementation generated from reading ui file 'desRacine.ui'
+#
+# Created: jeu avr 26 14:24:43 2007
+#      by: The PyQt User Interface Compiler (pyuic) 3.13
+#
+# WARNING! All changes made in this file will be lost!
+
+
+from qt import *
+
+image0_data = \
+    "\x89\x50\x4e\x47\x0d\x0a\x1a\x0a\x00\x00\x00\x0d" \
+    "\x49\x48\x44\x52\x00\x00\x00\x21\x00\x00\x00\x0e" \
+    "\x08\x06\x00\x00\x00\xa1\x1e\x75\x8c\x00\x00\x00" \
+    "\xcf\x49\x44\x41\x54\x38\x8d\xd5\x94\xdb\x0e\xc3" \
+    "\x20\x0c\x43\xed\xfd\xf8\xd8\x97\xbb\x0f\x34\x5b" \
+    "\x48\x08\x45\xd5\x1e\xb6\x48\x88\xf4\x12\xe7\x60" \
+    "\x01\xc0\x0f\x04\x6f\xd6\xe9\x9b\xba\x77\x20\x04" \
+    "\x80\x92\x4a\x10\x32\xc9\x2e\xfb\xd8\xc7\xd5\xca" \
+    "\xbc\xc0\x25\x40\x00\x99\xe9\x57\x84\x95\x68\xfe" \
+    "\x7f\x06\xc0\xde\xd1\xde\xb3\x2b\x4a\x1e\xc4\xea" \
+    "\x82\x4b\x9e\x74\x09\x71\x65\xbd\x01\xf8\x55\x27" \
+    "\xf7\x8a\x72\x01\xe0\xa3\x12\x9f\x34\x5a\x01\x7c" \
+    "\x54\x3b\xaf\xdc\x98\x3d\x0f\x71\x09\xd1\x5a\x33" \
+    "\x1b\x47\x1f\x47\x07\x2c\x17\x49\x4a\x82\x33\x8f" \
+    "\x61\x78\x20\x3a\x88\x17\xe6\x73\x06\xb1\xf0\x8b" \
+    "\x07\xba\x03\xe6\x02\xc9\xb8\x31\x07\x7e\x37\xe0" \
+    "\x20\x9e\x67\xe3\x38\x67\x10\x97\x7b\x17\xde\x80" \
+    "\xc1\x85\xad\x38\x69\x5a\x51\xd5\x22\xc8\x2c\xe7" \
+    "\x79\x12\xe2\xfe\xd8\xbe\x83\x76\x20\x92\xf5\x2b" \
+    "\x18\x20\xdd\x11\xbb\x10\xe5\x65\xb5\x3a\x5a\x3b" \
+    "\xba\xff\x13\x07\x13\xd6\x6f\xa6\x98\x18\x57\x06" \
+    "\x00\x00\x00\x00\x49\x45\x4e\x44\xae\x42\x60\x82"
+
+class DRac(QWidget):
+    def __init__(self,parent = None,name = None,fl = 0):
+        QWidget.__init__(self,parent,name,fl)
+
+        self.image0 = QPixmap()
+        self.image0.loadFromData(image0_data,"PNG")
+        if not name:
+            self.setName("DRac")
+
+        self.setMinimumSize(QSize(505,0))
+
+
+        self.bHelp = QPushButton(self,"bHelp")
+        self.bHelp.setGeometry(QRect(10,440,142,30))
+        self.bHelp.setAutoDefault(1)
+
+        self.textLabel6 = QLabel(self,"textLabel6")
+        self.textLabel6.setGeometry(QRect(10,70,30,30))
+
+        self.textLabel1_4_2 = QLabel(self,"textLabel1_4_2")
+        self.textLabel1_4_2.setGeometry(QRect(350,0,50,21))
+
+        self.LEFiltre = QLineEdit(self,"LEFiltre")
+        self.LEFiltre.setGeometry(QRect(50,70,140,30))
+
+        self.BNext = QToolButton(self,"BNext")
+        self.BNext.setGeometry(QRect(200,70,30,31))
+        self.BNext.setIconSet(QIconSet(self.image0))
+
+        self.textLabel1_4 = QLabel(self,"textLabel1_4")
+        self.textLabel1_4.setGeometry(QRect(90,0,75,21))
+
+        self.buttonGroup1 = QButtonGroup(self,"buttonGroup1")
+        self.buttonGroup1.setGeometry(QRect(10,20,230,40))
+
+        self.RBGroupe = QRadioButton(self.buttonGroup1,"RBGroupe")
+        self.RBGroupe.setGeometry(QRect(20,10,101,20))
+
+        self.RBalpha = QRadioButton(self.buttonGroup1,"RBalpha")
+        self.RBalpha.setGeometry(QRect(140,10,80,20))
+        self.RBalpha.setChecked(1)
+
+        self.bOk = QPushButton(self,"bOk")
+        self.bOk.setGeometry(QRect(180,440,142,30))
+        self.bOk.setAutoDefault(1)
+        self.bOk.setDefault(1)
+
+        self.bSup = QPushButton(self,"bSup")
+        self.bSup.setGeometry(QRect(350,440,142,30))
+        self.bSup.setAutoDefault(1)
+
+        self.LBNouvCommande = QListBox(self,"LBNouvCommande")
+        self.LBNouvCommande.setGeometry(QRect(10,110,230,320))
+
+        self.LBRegles = QListBox(self,"LBRegles")
+        self.LBRegles.setGeometry(QRect(260,30,230,400))
+
+        self.languageChange()
+
+        self.resize(QSize(505,499).expandedTo(self.minimumSizeHint()))
+        self.clearWState(Qt.WState_Polished)
+
+        self.connect(self.LBNouvCommande,SIGNAL("clicked(QListBoxItem*)"),self.LBNouvCommandeClicked)
+        self.connect(self.LEFiltre,SIGNAL("textChanged(const QString&)"),self.LEFiltreTextChanged)
+        self.connect(self.LEFiltre,SIGNAL("returnPressed()"),self.LEfiltreReturnPressed)
+        self.connect(self.bSup,SIGNAL("pressed()"),self.BSupPressed)
+        self.connect(self.bOk,SIGNAL("clicked()"),self.BOkPressed)
+        self.connect(self.RBalpha,SIGNAL("clicked()"),self.BuildTabCommand)
+        self.connect(self.RBGroupe,SIGNAL("clicked()"),self.BuildTabCommand)
+        self.connect(self.BNext,SIGNAL("clicked()"),self.BNextPressed)
+
+
+    def languageChange(self):
+        self.setCaption(self.__tr("DMacro"))
+        self.bHelp.setText(self.__tr("&Documentation"))
+        self.bHelp.setAccel(self.__tr("Alt+D"))
+        QToolTip.add(self.bHelp,self.__tr("affichage documentation aster"))
+        self.textLabel6.setText(self.__tr("Filtre"))
+        self.textLabel1_4_2.setText(self.__trUtf8("\x3c\x62\x3e\x3c\x75\x3e\x52\xc3\xa9\x67\x6c\x65\x73\x20\x3a\x3c\x2f\x75\x3e\x3c\x2f\x62\x3e"))
+        self.BNext.setText(QString.null)
+        QToolTip.add(self.BNext,self.__tr("affiche la prochaine occurence"))
+        self.textLabel1_4.setText(self.__tr("<b><u>Commandes :</u></b>"))
+        self.buttonGroup1.setTitle(self.__tr("Affichage"))
+        self.RBGroupe.setText(self.__tr("par groupe"))
+        self.RBalpha.setText(self.__trUtf8("\x61\x6c\x70\x68\x61\x62\xc3\xa9\x74\x69\x71\x75\x65"))
+        self.bOk.setText(self.__tr("&Valider"))
+        self.bOk.setAccel(self.__tr("Shift+A, Alt+A, Alt+A, Alt+A"))
+        QToolTip.add(self.bOk,self.__tr("validation de la saisie"))
+        self.bSup.setText(self.__tr("&Supprimer"))
+        self.bSup.setAccel(self.__tr("Alt+S"))
+        QToolTip.add(self.bSup,self.__tr("suppression du mot clef"))
+
+
+    def LBNouvCommandeClicked(self):
+        print "DRac.LBNouvCommandeClicked(): Not implemented yet"
+
+    def LEFiltreTextChanged(self):
+        print "DRac.LEFiltreTextChanged(): Not implemented yet"
+
+    def LEfiltreReturnPressed(self):
+        print "DRac.LEfiltreReturnPressed(): Not implemented yet"
+
+    def BSupPressed(self):
+        print "DRac.BSupPressed(): Not implemented yet"
+
+    def BOkPressed(self):
+        print "DRac.BOkPressed(): Not implemented yet"
+
+    def BuildTabCommand(self):
+        print "DRac.BuildTabCommand(): Not implemented yet"
+
+    def BNextPressed(self):
+        print "DRac.BNextPressed(): Not implemented yet"
+
+    def __tr(self,s,c = None):
+        return qApp.translate("DRac",s,c)
+
+    def __trUtf8(self,s,c = None):
+        return qApp.translate("DRac",s,c,QApplication.UnicodeUTF8)
diff --git a/Ui/desRacine.ui b/Ui/desRacine.ui
new file mode 100644 (file)
index 0000000..e3c4636
--- /dev/null
@@ -0,0 +1,328 @@
+<!DOCTYPE UI><UI version="3.3" stdsetdef="1">
+<class>DRac</class>
+<widget class="QWidget">
+    <property name="name">
+        <cstring>DRac</cstring>
+    </property>
+    <property name="geometry">
+        <rect>
+            <x>0</x>
+            <y>0</y>
+            <width>505</width>
+            <height>499</height>
+        </rect>
+    </property>
+    <property name="minimumSize">
+        <size>
+            <width>505</width>
+            <height>0</height>
+        </size>
+    </property>
+    <property name="caption">
+        <string>DMacro</string>
+    </property>
+    <widget class="QPushButton">
+        <property name="name">
+            <cstring>bHelp</cstring>
+        </property>
+        <property name="geometry">
+            <rect>
+                <x>10</x>
+                <y>440</y>
+                <width>142</width>
+                <height>30</height>
+            </rect>
+        </property>
+        <property name="text">
+            <string>&amp;Documentation</string>
+        </property>
+        <property name="accel">
+            <string>Alt+D</string>
+        </property>
+        <property name="autoDefault">
+            <bool>true</bool>
+        </property>
+        <property name="toolTip" stdset="0">
+            <string>affichage documentation aster</string>
+        </property>
+    </widget>
+    <widget class="QLabel">
+        <property name="name">
+            <cstring>textLabel6</cstring>
+        </property>
+        <property name="geometry">
+            <rect>
+                <x>10</x>
+                <y>70</y>
+                <width>30</width>
+                <height>30</height>
+            </rect>
+        </property>
+        <property name="text">
+            <string>Filtre</string>
+        </property>
+    </widget>
+    <widget class="QLabel">
+        <property name="name">
+            <cstring>textLabel1_4_2</cstring>
+        </property>
+        <property name="geometry">
+            <rect>
+                <x>350</x>
+                <y>0</y>
+                <width>50</width>
+                <height>21</height>
+            </rect>
+        </property>
+        <property name="text">
+            <string>&lt;b&gt;&lt;u&gt;Régles :&lt;/u&gt;&lt;/b&gt;</string>
+        </property>
+    </widget>
+    <widget class="QLineEdit">
+        <property name="name">
+            <cstring>LEFiltre</cstring>
+        </property>
+        <property name="geometry">
+            <rect>
+                <x>50</x>
+                <y>70</y>
+                <width>140</width>
+                <height>30</height>
+            </rect>
+        </property>
+    </widget>
+    <widget class="QToolButton">
+        <property name="name">
+            <cstring>BNext</cstring>
+        </property>
+        <property name="geometry">
+            <rect>
+                <x>200</x>
+                <y>70</y>
+                <width>30</width>
+                <height>31</height>
+            </rect>
+        </property>
+        <property name="text">
+            <string></string>
+        </property>
+        <property name="iconSet">
+            <iconset>image0</iconset>
+        </property>
+        <property name="toolTip" stdset="0">
+            <string>affiche la prochaine occurence</string>
+        </property>
+    </widget>
+    <widget class="QLabel">
+        <property name="name">
+            <cstring>textLabel1_4</cstring>
+        </property>
+        <property name="geometry">
+            <rect>
+                <x>90</x>
+                <y>0</y>
+                <width>75</width>
+                <height>21</height>
+            </rect>
+        </property>
+        <property name="text">
+            <string>&lt;b&gt;&lt;u&gt;Commandes :&lt;/u&gt;&lt;/b&gt;</string>
+        </property>
+    </widget>
+    <widget class="QButtonGroup">
+        <property name="name">
+            <cstring>buttonGroup1</cstring>
+        </property>
+        <property name="geometry">
+            <rect>
+                <x>10</x>
+                <y>20</y>
+                <width>230</width>
+                <height>40</height>
+            </rect>
+        </property>
+        <property name="title">
+            <string>Affichage</string>
+        </property>
+        <widget class="QRadioButton">
+            <property name="name">
+                <cstring>RBGroupe</cstring>
+            </property>
+            <property name="geometry">
+                <rect>
+                    <x>20</x>
+                    <y>10</y>
+                    <width>101</width>
+                    <height>20</height>
+                </rect>
+            </property>
+            <property name="text">
+                <string>par groupe</string>
+            </property>
+        </widget>
+        <widget class="QRadioButton">
+            <property name="name">
+                <cstring>RBalpha</cstring>
+            </property>
+            <property name="geometry">
+                <rect>
+                    <x>140</x>
+                    <y>10</y>
+                    <width>80</width>
+                    <height>20</height>
+                </rect>
+            </property>
+            <property name="text">
+                <string>alphabétique</string>
+            </property>
+            <property name="checked">
+                <bool>true</bool>
+            </property>
+        </widget>
+    </widget>
+    <widget class="QPushButton">
+        <property name="name">
+            <cstring>bOk</cstring>
+        </property>
+        <property name="geometry">
+            <rect>
+                <x>180</x>
+                <y>440</y>
+                <width>142</width>
+                <height>30</height>
+            </rect>
+        </property>
+        <property name="text">
+            <string>&amp;Valider</string>
+        </property>
+        <property name="accel">
+            <string>Shift+A, Alt+A, Alt+A, Alt+A</string>
+        </property>
+        <property name="autoDefault">
+            <bool>true</bool>
+        </property>
+        <property name="default">
+            <bool>true</bool>
+        </property>
+        <property name="toolTip" stdset="0">
+            <string>validation de la saisie</string>
+        </property>
+    </widget>
+    <widget class="QPushButton">
+        <property name="name">
+            <cstring>bSup</cstring>
+        </property>
+        <property name="geometry">
+            <rect>
+                <x>350</x>
+                <y>440</y>
+                <width>142</width>
+                <height>30</height>
+            </rect>
+        </property>
+        <property name="text">
+            <string>&amp;Supprimer</string>
+        </property>
+        <property name="accel">
+            <string>Alt+S</string>
+        </property>
+        <property name="autoDefault">
+            <bool>true</bool>
+        </property>
+        <property name="toolTip" stdset="0">
+            <string>suppression du mot clef</string>
+        </property>
+    </widget>
+    <widget class="QListBox">
+        <property name="name">
+            <cstring>LBNouvCommande</cstring>
+        </property>
+        <property name="geometry">
+            <rect>
+                <x>10</x>
+                <y>110</y>
+                <width>230</width>
+                <height>320</height>
+            </rect>
+        </property>
+    </widget>
+    <widget class="QListBox">
+        <property name="name">
+            <cstring>LBRegles</cstring>
+        </property>
+        <property name="geometry">
+            <rect>
+                <x>260</x>
+                <y>30</y>
+                <width>230</width>
+                <height>400</height>
+            </rect>
+        </property>
+    </widget>
+</widget>
+<images>
+    <image name="image0">
+        <data format="PNG" length="264">89504e470d0a1a0a0000000d49484452000000210000000e0806000000a11e758c000000cf49444154388dd594db0ec3200c43edfdf8d897bb0f345b480845d51eb64888f412e76001c00f046fd6e99bba77200480924a1032c92efbd8c7d5cabcc025400099e957849568fe7f06c0ded1deb32b4a1ec4ea824b9e74097165bd01f85527f78a7201e0a3129f345a017c543bafdc983d0f7109d15a331b471f47072c17494a82338f6178203a8817e67306b1f08b07ba03e602c9b831077e37e0209e67e3386710977b17de80c185ad38695a51d522c82ce77912e2fed8be83762092f52b1820dd11bb10e565b53a5a3bbaff130713d66fa6981857060000000049454e44ae426082</data>
+    </image>
+</images>
+<connections>
+    <connection>
+        <sender>LBNouvCommande</sender>
+        <signal>clicked(QListBoxItem*)</signal>
+        <receiver>DRac</receiver>
+        <slot>LBNouvCommandeClicked()</slot>
+    </connection>
+    <connection>
+        <sender>LEFiltre</sender>
+        <signal>textChanged(const QString&amp;)</signal>
+        <receiver>DRac</receiver>
+        <slot>LEFiltreTextChanged()</slot>
+    </connection>
+    <connection>
+        <sender>LEFiltre</sender>
+        <signal>returnPressed()</signal>
+        <receiver>DRac</receiver>
+        <slot>LEfiltreReturnPressed()</slot>
+    </connection>
+    <connection>
+        <sender>bSup</sender>
+        <signal>pressed()</signal>
+        <receiver>DRac</receiver>
+        <slot>BSupPressed()</slot>
+    </connection>
+    <connection>
+        <sender>bOk</sender>
+        <signal>clicked()</signal>
+        <receiver>DRac</receiver>
+        <slot>BOkPressed()</slot>
+    </connection>
+    <connection>
+        <sender>RBalpha</sender>
+        <signal>clicked()</signal>
+        <receiver>DRac</receiver>
+        <slot>BuildTabCommand()</slot>
+    </connection>
+    <connection>
+        <sender>RBGroupe</sender>
+        <signal>clicked()</signal>
+        <receiver>DRac</receiver>
+        <slot>BuildTabCommand()</slot>
+    </connection>
+    <connection>
+        <sender>BNext</sender>
+        <signal>clicked()</signal>
+        <receiver>DRac</receiver>
+        <slot>BNextPressed()</slot>
+    </connection>
+</connections>
+<slots>
+    <slot>LBNouvCommandeClicked()</slot>
+    <slot>LEFiltreTextChanged()</slot>
+    <slot>LEfiltreReturnPressed()</slot>
+    <slot>BSupPressed()</slot>
+    <slot>BOkPressed()</slot>
+    <slot>BuildTabCommand()</slot>
+    <slot>BNextPressed()</slot>
+</slots>
+<layoutdefaults spacing="6" margin="11"/>
+</UI>
diff --git a/Ui/desUniqueASSD.py b/Ui/desUniqueASSD.py
new file mode 100644 (file)
index 0000000..24b38d7
--- /dev/null
@@ -0,0 +1,91 @@
+# -*- coding: utf-8 -*-
+
+# Form implementation generated from reading ui file 'desUniqueASSD.ui'
+#
+# Created: mer mar 21 10:41:08 2007
+#      by: The PyQt User Interface Compiler (pyuic) 3.13
+#
+# WARNING! All changes made in this file will be lost!
+
+
+from qt import *
+
+
+class DUnASSD(QWidget):
+    def __init__(self,parent = None,name = None,fl = 0):
+        QWidget.__init__(self,parent,name,fl)
+
+        if not name:
+            self.setName("DUnASSD")
+
+        self.setMinimumSize(QSize(350,0))
+
+
+        self.tabuniqueinto = QTabWidget(self,"tabuniqueinto")
+        self.tabuniqueinto.setGeometry(QRect(10,20,460,440))
+
+        self.Widget8 = QWidget(self.tabuniqueinto,"Widget8")
+
+        self.bSup = QPushButton(self.Widget8,"bSup")
+        self.bSup.setGeometry(QRect(310,370,142,30))
+        self.bSup.setAutoDefault(1)
+
+        self.bOk = QPushButton(self.Widget8,"bOk")
+        self.bOk.setGeometry(QRect(160,370,142,30))
+        self.bOk.setAutoDefault(1)
+        self.bOk.setDefault(1)
+
+        self.bHelp = QPushButton(self.Widget8,"bHelp")
+        self.bHelp.setGeometry(QRect(10,370,142,30))
+        self.bHelp.setAutoDefault(1)
+
+        self.textLabel2 = QLabel(self.Widget8,"textLabel2")
+        self.textLabel2.setGeometry(QRect(140,20,160,60))
+
+        self.Commentaire = QLabel(self.Widget8,"Commentaire")
+        self.Commentaire.setGeometry(QRect(40,311,381,30))
+
+        self.listBoxASSD = QListBox(self.Widget8,"listBoxASSD")
+        self.listBoxASSD.setGeometry(QRect(40,100,380,180))
+        self.tabuniqueinto.insertTab(self.Widget8,QString(""))
+
+        self.languageChange()
+
+        self.resize(QSize(482,480).expandedTo(self.minimumSizeHint()))
+        self.clearWState(Qt.WState_Polished)
+
+        self.connect(self.bHelp,SIGNAL("clicked()"),self.ViewDoc)
+        self.connect(self.bOk,SIGNAL("clicked()"),self.BOkPressed)
+        self.connect(self.bSup,SIGNAL("clicked()"),self.BSupPressed)
+
+
+    def languageChange(self):
+        self.setCaption(self.__tr("DUnIn"))
+        self.bSup.setText(self.__tr("&Supprimer"))
+        self.bSup.setAccel(self.__tr("Alt+S"))
+        QToolTip.add(self.bSup,self.__tr("suppression du mot clef"))
+        self.bOk.setText(self.__tr("&Valider"))
+        self.bOk.setAccel(self.__tr("Shift+A, Alt+A, Alt+A, Alt+A"))
+        QToolTip.add(self.bOk,self.__tr("validation de la saisie"))
+        self.bHelp.setText(self.__tr("&Documentation"))
+        self.bHelp.setAccel(self.__tr("Alt+D"))
+        QToolTip.add(self.bHelp,self.__tr("affichage documentation aster"))
+        self.textLabel2.setText(self.__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\x53\x74\x72\x75\x63\x74\x75\x72\x65\x73\x20\x64\x65\x20\x64\x6f\x6e\x6e\xc3\xa9\x65\x73\x20\x64\x75\x20\x74\x79\x70\x65\x0a\x72\x65\x71\x75\x69\x73\x20\x70\x61\x72\x20\x6c\x27\x6f\x62\x6a\x65\x74\x20\x63\x6f\x75\x72\x61\x6e\x74\x20\x3a\x3c\x2f\x70\x3e\x3c\x2f\x66\x6f\x6e\x74\x3e"))
+        self.Commentaire.setText(QString.null)
+        self.tabuniqueinto.changeTab(self.Widget8,self.__tr("Saisir Valeur"))
+
+
+    def BSupPressed(self):
+        print "DUnASSD.BSupPressed(): Not implemented yet"
+
+    def ViewDoc(self):
+        print "DUnASSD.ViewDoc(): Not implemented yet"
+
+    def BOkPressed(self):
+        print "DUnASSD.BOkPressed(): Not implemented yet"
+
+    def __tr(self,s,c = None):
+        return qApp.translate("DUnASSD",s,c)
+
+    def __trUtf8(self,s,c = None):
+        return qApp.translate("DUnASSD",s,c,QApplication.UnicodeUTF8)
diff --git a/Ui/desUniqueASSD.ui b/Ui/desUniqueASSD.ui
new file mode 100644 (file)
index 0000000..a22cbb9
--- /dev/null
@@ -0,0 +1,196 @@
+<!DOCTYPE UI><UI version="3.3" stdsetdef="1">
+<class>DUnASSD</class>
+<widget class="QWidget">
+    <property name="name">
+        <cstring>DUnASSD</cstring>
+    </property>
+    <property name="geometry">
+        <rect>
+            <x>0</x>
+            <y>0</y>
+            <width>482</width>
+            <height>480</height>
+        </rect>
+    </property>
+    <property name="minimumSize">
+        <size>
+            <width>350</width>
+            <height>0</height>
+        </size>
+    </property>
+    <property name="caption">
+        <string>DUnIn</string>
+    </property>
+    <widget class="QTabWidget">
+        <property name="name">
+            <cstring>tabuniqueinto</cstring>
+        </property>
+        <property name="geometry">
+            <rect>
+                <x>10</x>
+                <y>20</y>
+                <width>460</width>
+                <height>440</height>
+            </rect>
+        </property>
+        <widget class="QWidget">
+            <property name="name">
+                <cstring>Widget8</cstring>
+            </property>
+            <attribute name="title">
+                <string>Saisir Valeur</string>
+            </attribute>
+            <widget class="QPushButton">
+                <property name="name">
+                    <cstring>bSup</cstring>
+                </property>
+                <property name="geometry">
+                    <rect>
+                        <x>310</x>
+                        <y>370</y>
+                        <width>142</width>
+                        <height>30</height>
+                    </rect>
+                </property>
+                <property name="text">
+                    <string>&amp;Supprimer</string>
+                </property>
+                <property name="accel">
+                    <string>Alt+S</string>
+                </property>
+                <property name="autoDefault">
+                    <bool>true</bool>
+                </property>
+                <property name="toolTip" stdset="0">
+                    <string>suppression du mot clef</string>
+                </property>
+            </widget>
+            <widget class="QPushButton">
+                <property name="name">
+                    <cstring>bOk</cstring>
+                </property>
+                <property name="geometry">
+                    <rect>
+                        <x>160</x>
+                        <y>370</y>
+                        <width>142</width>
+                        <height>30</height>
+                    </rect>
+                </property>
+                <property name="text">
+                    <string>&amp;Valider</string>
+                </property>
+                <property name="accel">
+                    <string>Shift+A, Alt+A, Alt+A, Alt+A</string>
+                </property>
+                <property name="autoDefault">
+                    <bool>true</bool>
+                </property>
+                <property name="default">
+                    <bool>true</bool>
+                </property>
+                <property name="toolTip" stdset="0">
+                    <string>validation de la saisie</string>
+                </property>
+            </widget>
+            <widget class="QPushButton">
+                <property name="name">
+                    <cstring>bHelp</cstring>
+                </property>
+                <property name="geometry">
+                    <rect>
+                        <x>10</x>
+                        <y>370</y>
+                        <width>142</width>
+                        <height>30</height>
+                    </rect>
+                </property>
+                <property name="text">
+                    <string>&amp;Documentation</string>
+                </property>
+                <property name="accel">
+                    <string>Alt+D</string>
+                </property>
+                <property name="autoDefault">
+                    <bool>true</bool>
+                </property>
+                <property name="toolTip" stdset="0">
+                    <string>affichage documentation aster</string>
+                </property>
+            </widget>
+            <widget class="QLabel">
+                <property name="name">
+                    <cstring>textLabel2</cstring>
+                </property>
+                <property name="geometry">
+                    <rect>
+                        <x>140</x>
+                        <y>20</y>
+                        <width>160</width>
+                        <height>60</height>
+                    </rect>
+                </property>
+                <property name="text">
+                    <string>&lt;font size="+1"&gt;&lt;p align="center"&gt;Structures de données du type
+requis par l'objet courant :&lt;/p&gt;&lt;/font&gt;</string>
+                </property>
+            </widget>
+            <widget class="QLabel">
+                <property name="name">
+                    <cstring>Commentaire</cstring>
+                </property>
+                <property name="geometry">
+                    <rect>
+                        <x>40</x>
+                        <y>311</y>
+                        <width>381</width>
+                        <height>30</height>
+                    </rect>
+                </property>
+                <property name="text">
+                    <string></string>
+                </property>
+            </widget>
+            <widget class="QListBox">
+                <property name="name">
+                    <cstring>listBoxASSD</cstring>
+                </property>
+                <property name="geometry">
+                    <rect>
+                        <x>40</x>
+                        <y>100</y>
+                        <width>380</width>
+                        <height>180</height>
+                    </rect>
+                </property>
+            </widget>
+        </widget>
+    </widget>
+</widget>
+<connections>
+    <connection>
+        <sender>bHelp</sender>
+        <signal>clicked()</signal>
+        <receiver>DUnASSD</receiver>
+        <slot>ViewDoc()</slot>
+    </connection>
+    <connection>
+        <sender>bOk</sender>
+        <signal>clicked()</signal>
+        <receiver>DUnASSD</receiver>
+        <slot>BOkPressed()</slot>
+    </connection>
+    <connection>
+        <sender>bSup</sender>
+        <signal>clicked()</signal>
+        <receiver>DUnASSD</receiver>
+        <slot>BSupPressed()</slot>
+    </connection>
+</connections>
+<slots>
+    <slot>BSupPressed()</slot>
+    <slot>ViewDoc()</slot>
+    <slot>BOkPressed()</slot>
+</slots>
+<layoutdefaults spacing="6" margin="11"/>
+</UI>
diff --git a/Ui/desUniqueBase.py b/Ui/desUniqueBase.py
new file mode 100644 (file)
index 0000000..7f69b8e
--- /dev/null
@@ -0,0 +1,99 @@
+# -*- coding: utf-8 -*-
+
+# Form implementation generated from reading ui file 'desUniqueBasePanel.ui'
+#
+# Created: mar mar 20 14:05:29 2007
+#      by: The PyQt User Interface Compiler (pyuic) 3.13
+#
+# WARNING! All changes made in this file will be lost!
+
+
+from qt import *
+
+
+class DUnBase(QWidget):
+    def __init__(self,parent = None,name = None,fl = 0):
+        QWidget.__init__(self,parent,name,fl)
+
+        if not name:
+            self.setName("DUnBase")
+
+        self.setMinimumSize(QSize(350,0))
+
+
+        self.tabuniqueinto = QTabWidget(self,"tabuniqueinto")
+        self.tabuniqueinto.setGeometry(QRect(10,20,460,440))
+
+        self.Widget8 = QWidget(self.tabuniqueinto,"Widget8")
+
+        self.bSup = QPushButton(self.Widget8,"bSup")
+        self.bSup.setGeometry(QRect(310,370,142,30))
+        self.bSup.setAutoDefault(1)
+
+        self.bOk = QPushButton(self.Widget8,"bOk")
+        self.bOk.setGeometry(QRect(160,370,142,30))
+        self.bOk.setAutoDefault(1)
+        self.bOk.setDefault(1)
+
+        self.bHelp = QPushButton(self.Widget8,"bHelp")
+        self.bHelp.setGeometry(QRect(10,370,142,30))
+        self.bHelp.setAutoDefault(1)
+
+        self.Commentaire = QLabel(self.Widget8,"Commentaire")
+        self.Commentaire.setGeometry(QRect(38,316,381,41))
+
+        self.textLabel2 = QLabel(self.Widget8,"textLabel2")
+        self.textLabel2.setGeometry(QRect(40,160,50,21))
+
+        self.lineEditVal = QLineEdit(self.Widget8,"lineEditVal")
+        self.lineEditVal.setGeometry(QRect(120,150,231,31))
+
+        self.bParametres = QPushButton(self.Widget8,"bParametres")
+        self.bParametres.setGeometry(QRect(300,10,140,30))
+        self.tabuniqueinto.insertTab(self.Widget8,QString(""))
+
+        self.languageChange()
+
+        self.resize(QSize(482,480).expandedTo(self.minimumSizeHint()))
+        self.clearWState(Qt.WState_Polished)
+
+        self.connect(self.bHelp,SIGNAL("clicked()"),self.ViewDoc)
+        self.connect(self.bOk,SIGNAL("clicked()"),self.BOk2Pressed)
+        self.connect(self.bSup,SIGNAL("clicked()"),self.BSupPressed)
+        self.connect(self.lineEditVal,SIGNAL("returnPressed()"),self.LEValeurPressed)
+
+
+    def languageChange(self):
+        self.setCaption(self.__tr("DUnIn"))
+        self.bSup.setText(self.__tr("&Supprimer"))
+        self.bSup.setAccel(self.__tr("Alt+S"))
+        QToolTip.add(self.bSup,self.__tr("suppression du mot clef"))
+        self.bOk.setText(self.__tr("&Valider"))
+        self.bOk.setAccel(self.__tr("Shift+A, Alt+A, Alt+A, Alt+A"))
+        QToolTip.add(self.bOk,self.__tr("validation de la saisie"))
+        self.bHelp.setText(self.__tr("&Documentation"))
+        self.bHelp.setAccel(self.__tr("Alt+D"))
+        QToolTip.add(self.bHelp,self.__tr("affichage documentation aster"))
+        self.Commentaire.setText(QString.null)
+        self.textLabel2.setText(self.__tr("<b><u><p align=\"center\">Valeur: </p></u></b>"))
+        self.bParametres.setText(self.__tr("Parametres"))
+        self.tabuniqueinto.changeTab(self.Widget8,self.__tr("Saisir Valeur"))
+
+
+    def BSupPressed(self):
+        print "DUnBase.BSupPressed(): Not implemented yet"
+
+    def ViewDoc(self):
+        print "DUnBase.ViewDoc(): Not implemented yet"
+
+    def BOk2Pressed(self):
+        print "DUnBase.BOk2Pressed(): Not implemented yet"
+
+    def BParametresPressed(self):
+        print "DUnBase.BParametresPressed(): Not implemented yet"
+
+    def LEValeurPressed(self):
+        print "DUnBase.LEValeurPressed(): Not implemented yet"
+
+    def __tr(self,s,c = None):
+        return qApp.translate("DUnBase",s,c)
diff --git a/Ui/desUniqueBase.ui b/Ui/desUniqueBase.ui
new file mode 100644 (file)
index 0000000..0c47dc4
--- /dev/null
@@ -0,0 +1,219 @@
+<!DOCTYPE UI><UI version="3.3" stdsetdef="1">
+<class>DUnBase</class>
+<widget class="QWidget">
+    <property name="name">
+        <cstring>DUnBase</cstring>
+    </property>
+    <property name="geometry">
+        <rect>
+            <x>0</x>
+            <y>0</y>
+            <width>482</width>
+            <height>480</height>
+        </rect>
+    </property>
+    <property name="minimumSize">
+        <size>
+            <width>350</width>
+            <height>0</height>
+        </size>
+    </property>
+    <property name="caption">
+        <string>DUnIn</string>
+    </property>
+    <widget class="QTabWidget">
+        <property name="name">
+            <cstring>tabuniqueinto</cstring>
+        </property>
+        <property name="geometry">
+            <rect>
+                <x>10</x>
+                <y>20</y>
+                <width>460</width>
+                <height>440</height>
+            </rect>
+        </property>
+        <widget class="QWidget">
+            <property name="name">
+                <cstring>Widget8</cstring>
+            </property>
+            <attribute name="title">
+                <string>Saisir Valeur</string>
+            </attribute>
+            <widget class="QPushButton">
+                <property name="name">
+                    <cstring>bSup</cstring>
+                </property>
+                <property name="geometry">
+                    <rect>
+                        <x>310</x>
+                        <y>370</y>
+                        <width>142</width>
+                        <height>30</height>
+                    </rect>
+                </property>
+                <property name="text">
+                    <string>&amp;Supprimer</string>
+                </property>
+                <property name="accel">
+                    <string>Alt+S</string>
+                </property>
+                <property name="autoDefault">
+                    <bool>true</bool>
+                </property>
+                <property name="toolTip" stdset="0">
+                    <string>suppression du mot clef</string>
+                </property>
+            </widget>
+            <widget class="QPushButton">
+                <property name="name">
+                    <cstring>bOk</cstring>
+                </property>
+                <property name="geometry">
+                    <rect>
+                        <x>160</x>
+                        <y>370</y>
+                        <width>142</width>
+                        <height>30</height>
+                    </rect>
+                </property>
+                <property name="text">
+                    <string>&amp;Valider</string>
+                </property>
+                <property name="accel">
+                    <string>Shift+A, Alt+A, Alt+A, Alt+A</string>
+                </property>
+                <property name="autoDefault">
+                    <bool>true</bool>
+                </property>
+                <property name="default">
+                    <bool>true</bool>
+                </property>
+                <property name="toolTip" stdset="0">
+                    <string>validation de la saisie</string>
+                </property>
+            </widget>
+            <widget class="QPushButton">
+                <property name="name">
+                    <cstring>bHelp</cstring>
+                </property>
+                <property name="geometry">
+                    <rect>
+                        <x>10</x>
+                        <y>370</y>
+                        <width>142</width>
+                        <height>30</height>
+                    </rect>
+                </property>
+                <property name="text">
+                    <string>&amp;Documentation</string>
+                </property>
+                <property name="accel">
+                    <string>Alt+D</string>
+                </property>
+                <property name="autoDefault">
+                    <bool>true</bool>
+                </property>
+                <property name="toolTip" stdset="0">
+                    <string>affichage documentation aster</string>
+                </property>
+            </widget>
+            <widget class="QLabel">
+                <property name="name">
+                    <cstring>Commentaire</cstring>
+                </property>
+                <property name="geometry">
+                    <rect>
+                        <x>38</x>
+                        <y>316</y>
+                        <width>381</width>
+                        <height>41</height>
+                    </rect>
+                </property>
+                <property name="text">
+                    <string></string>
+                </property>
+            </widget>
+            <widget class="QLabel">
+                <property name="name">
+                    <cstring>textLabel2</cstring>
+                </property>
+                <property name="geometry">
+                    <rect>
+                        <x>40</x>
+                        <y>160</y>
+                        <width>50</width>
+                        <height>21</height>
+                    </rect>
+                </property>
+                <property name="text">
+                    <string>&lt;b&gt;&lt;u&gt;&lt;p align="center"&gt;Valeur: &lt;/p&gt;&lt;/u&gt;&lt;/b&gt;</string>
+                </property>
+            </widget>
+            <widget class="QLineEdit">
+                <property name="name">
+                    <cstring>lineEditVal</cstring>
+                </property>
+                <property name="geometry">
+                    <rect>
+                        <x>120</x>
+                        <y>150</y>
+                        <width>231</width>
+                        <height>31</height>
+                    </rect>
+                </property>
+            </widget>
+            <widget class="QPushButton">
+                <property name="name">
+                    <cstring>bParametres</cstring>
+                </property>
+                <property name="geometry">
+                    <rect>
+                        <x>300</x>
+                        <y>10</y>
+                        <width>140</width>
+                        <height>30</height>
+                    </rect>
+                </property>
+                <property name="text">
+                    <string>Parametres</string>
+                </property>
+            </widget>
+        </widget>
+    </widget>
+</widget>
+<connections>
+    <connection>
+        <sender>bHelp</sender>
+        <signal>clicked()</signal>
+        <receiver>DUnBase</receiver>
+        <slot>ViewDoc()</slot>
+    </connection>
+    <connection>
+        <sender>bOk</sender>
+        <signal>clicked()</signal>
+        <receiver>DUnBase</receiver>
+        <slot>BOk2Pressed()</slot>
+    </connection>
+    <connection>
+        <sender>bSup</sender>
+        <signal>clicked()</signal>
+        <receiver>DUnBase</receiver>
+        <slot>BSupPressed()</slot>
+    </connection>
+    <connection>
+        <sender>lineEditVal</sender>
+        <signal>returnPressed()</signal>
+        <receiver>DUnBase</receiver>
+        <slot>LEValeurPressed()</slot>
+    </connection>
+</connections>
+<slots>
+    <slot>BSupPressed()</slot>
+    <slot>ViewDoc()</slot>
+    <slot>BOk2Pressed()</slot>
+    <slot>BParametresPressed()</slot>
+    <slot>LEValeurPressed()</slot>
+</slots>
+<layoutdefaults spacing="6" margin="11"/>
+</UI>
diff --git a/Ui/desUniqueComp.py b/Ui/desUniqueComp.py
new file mode 100644 (file)
index 0000000..e0a470d
--- /dev/null
@@ -0,0 +1,121 @@
+# -*- coding: utf-8 -*-
+
+# Form implementation generated from reading ui file 'desUniqueComp.ui'
+#
+# Created: mar aoû 7 16:45:58 2007
+#      by: The PyQt User Interface Compiler (pyuic) 3.13
+#
+# WARNING! All changes made in this file will be lost!
+
+
+from qt import *
+
+
+class DUnComp(QWidget):
+    def __init__(self,parent = None,name = None,fl = 0):
+        QWidget.__init__(self,parent,name,fl)
+
+        if not name:
+            self.setName("DUnComp")
+
+        self.setMinimumSize(QSize(350,0))
+
+
+        self.tabuniqueinto = QTabWidget(self,"tabuniqueinto")
+        self.tabuniqueinto.setGeometry(QRect(10,20,460,440))
+
+        self.Widget8 = QWidget(self.tabuniqueinto,"Widget8")
+
+        self.bSup = QPushButton(self.Widget8,"bSup")
+        self.bSup.setGeometry(QRect(310,370,142,30))
+        self.bSup.setAutoDefault(1)
+
+        self.bOk = QPushButton(self.Widget8,"bOk")
+        self.bOk.setGeometry(QRect(160,370,142,30))
+        self.bOk.setAutoDefault(1)
+        self.bOk.setDefault(1)
+
+        self.bHelp = QPushButton(self.Widget8,"bHelp")
+        self.bHelp.setGeometry(QRect(10,370,142,30))
+        self.bHelp.setAutoDefault(1)
+
+        self.textLabel1 = QLabel(self.Widget8,"textLabel1")
+        self.textLabel1.setGeometry(QRect(60,30,190,20))
+
+        self.Commentaire = QLabel(self.Widget8,"Commentaire")
+        self.Commentaire.setGeometry(QRect(140,320,170,30))
+
+        self.LEImag = QLineEdit(self.Widget8,"LEImag")
+        self.LEImag.setGeometry(QRect(240,250,170,31))
+
+        self.LEReel = QLineEdit(self.Widget8,"LEReel")
+        self.LEReel.setGeometry(QRect(50,250,170,31))
+
+        self.LEcomp = QLineEdit(self.Widget8,"LEcomp")
+        self.LEcomp.setGeometry(QRect(50,60,360,40))
+
+        self.buttonGroup1 = QButtonGroup(self.Widget8,"buttonGroup1")
+        self.buttonGroup1.setGeometry(QRect(50,160,360,70))
+
+        self.RBMP = QRadioButton(self.buttonGroup1,"RBMP")
+        self.RBMP.setGeometry(QRect(10,40,330,21))
+
+        self.RBRI = QRadioButton(self.buttonGroup1,"RBRI")
+        self.RBRI.setGeometry(QRect(10,20,330,21))
+        self.tabuniqueinto.insertTab(self.Widget8,QString(""))
+
+        self.languageChange()
+
+        self.resize(QSize(484,480).expandedTo(self.minimumSizeHint()))
+        self.clearWState(Qt.WState_Polished)
+
+        self.connect(self.bHelp,SIGNAL("clicked()"),self.ViewDoc)
+        self.connect(self.bOk,SIGNAL("clicked()"),self.BOkPressed)
+        self.connect(self.bSup,SIGNAL("clicked()"),self.BSupPressed)
+        self.connect(self.LEImag,SIGNAL("returnPressed()"),self.LEImagRPressed)
+        self.connect(self.LEReel,SIGNAL("returnPressed()"),self.LEReelRPressed)
+        self.connect(self.LEcomp,SIGNAL("returnPressed()"),self.LEcompRPressed)
+
+
+    def languageChange(self):
+        self.setCaption(self.__tr("DUnComp"))
+        self.bSup.setText(self.__tr("&Supprimer"))
+        self.bSup.setAccel(self.__tr("Alt+S"))
+        QToolTip.add(self.bSup,self.__tr("suppression du mot clef"))
+        self.bOk.setText(self.__tr("&Valider"))
+        self.bOk.setAccel(self.__tr("Shift+A, Alt+A, Alt+A, Alt+A"))
+        QToolTip.add(self.bOk,self.__tr("validation de la saisie"))
+        self.bHelp.setText(self.__tr("&Documentation"))
+        self.bHelp.setAccel(self.__tr("Alt+D"))
+        QToolTip.add(self.bHelp,self.__tr("affichage documentation aster"))
+        self.textLabel1.setText(self.__tr("<font size=\"+2\">Complexe de la forme : a+bj</font>"))
+        self.Commentaire.setText(self.__tr("<font size=\"+2\">Un complexe est attendu</font>"))
+        self.buttonGroup1.setTitle(self.__tr("OU"))
+        self.RBMP.setText(self.__tr("MP        : Module                                                                          Phase"))
+        self.RBRI.setText(self.__trUtf8("\x52\x49\x20\x20\x20\x3a\x20\x52\xc3\xa9\x65\x6c\x09\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x49\x6d\x61\x67\x69\x6e\x61\x69\x72\x65"))
+        self.tabuniqueinto.changeTab(self.Widget8,self.__tr("Saisir Valeur"))
+
+
+    def BSupPressed(self):
+        print "DUnComp.BSupPressed(): Not implemented yet"
+
+    def ViewDoc(self):
+        print "DUnComp.ViewDoc(): Not implemented yet"
+
+    def BOkPressed(self):
+        print "DUnComp.BOkPressed(): Not implemented yet"
+
+    def LEImagRPressed(self):
+        print "DUnComp.LEImagRPressed(): Not implemented yet"
+
+    def LEReelRPressed(self):
+        print "DUnComp.LEReelRPressed(): Not implemented yet"
+
+    def LEcompRPressed(self):
+        print "DUnComp.LEcompRPressed(): Not implemented yet"
+
+    def __tr(self,s,c = None):
+        return qApp.translate("DUnComp",s,c)
+
+    def __trUtf8(self,s,c = None):
+        return qApp.translate("DUnComp",s,c,QApplication.UnicodeUTF8)
diff --git a/Ui/desUniqueComp.ui b/Ui/desUniqueComp.ui
new file mode 100644 (file)
index 0000000..54af791
--- /dev/null
@@ -0,0 +1,290 @@
+<!DOCTYPE UI><UI version="3.3" stdsetdef="1">
+<class>DUnComp</class>
+<widget class="QWidget">
+    <property name="name">
+        <cstring>DUnComp</cstring>
+    </property>
+    <property name="geometry">
+        <rect>
+            <x>0</x>
+            <y>0</y>
+            <width>484</width>
+            <height>480</height>
+        </rect>
+    </property>
+    <property name="minimumSize">
+        <size>
+            <width>350</width>
+            <height>0</height>
+        </size>
+    </property>
+    <property name="caption">
+        <string>DUnComp</string>
+    </property>
+    <widget class="QTabWidget">
+        <property name="name">
+            <cstring>tabuniqueinto</cstring>
+        </property>
+        <property name="geometry">
+            <rect>
+                <x>10</x>
+                <y>20</y>
+                <width>460</width>
+                <height>440</height>
+            </rect>
+        </property>
+        <widget class="QWidget">
+            <property name="name">
+                <cstring>Widget8</cstring>
+            </property>
+            <attribute name="title">
+                <string>Saisir Valeur</string>
+            </attribute>
+            <widget class="QPushButton">
+                <property name="name">
+                    <cstring>bSup</cstring>
+                </property>
+                <property name="geometry">
+                    <rect>
+                        <x>310</x>
+                        <y>370</y>
+                        <width>142</width>
+                        <height>30</height>
+                    </rect>
+                </property>
+                <property name="text">
+                    <string>&amp;Supprimer</string>
+                </property>
+                <property name="accel">
+                    <string>Alt+S</string>
+                </property>
+                <property name="autoDefault">
+                    <bool>true</bool>
+                </property>
+                <property name="toolTip" stdset="0">
+                    <string>suppression du mot clef</string>
+                </property>
+            </widget>
+            <widget class="QPushButton">
+                <property name="name">
+                    <cstring>bOk</cstring>
+                </property>
+                <property name="geometry">
+                    <rect>
+                        <x>160</x>
+                        <y>370</y>
+                        <width>142</width>
+                        <height>30</height>
+                    </rect>
+                </property>
+                <property name="text">
+                    <string>&amp;Valider</string>
+                </property>
+                <property name="accel">
+                    <string>Shift+A, Alt+A, Alt+A, Alt+A</string>
+                </property>
+                <property name="autoDefault">
+                    <bool>true</bool>
+                </property>
+                <property name="default">
+                    <bool>true</bool>
+                </property>
+                <property name="toolTip" stdset="0">
+                    <string>validation de la saisie</string>
+                </property>
+            </widget>
+            <widget class="QPushButton">
+                <property name="name">
+                    <cstring>bHelp</cstring>
+                </property>
+                <property name="geometry">
+                    <rect>
+                        <x>10</x>
+                        <y>370</y>
+                        <width>142</width>
+                        <height>30</height>
+                    </rect>
+                </property>
+                <property name="text">
+                    <string>&amp;Documentation</string>
+                </property>
+                <property name="accel">
+                    <string>Alt+D</string>
+                </property>
+                <property name="autoDefault">
+                    <bool>true</bool>
+                </property>
+                <property name="toolTip" stdset="0">
+                    <string>affichage documentation aster</string>
+                </property>
+            </widget>
+            <widget class="QLabel">
+                <property name="name">
+                    <cstring>textLabel1</cstring>
+                </property>
+                <property name="geometry">
+                    <rect>
+                        <x>60</x>
+                        <y>30</y>
+                        <width>190</width>
+                        <height>20</height>
+                    </rect>
+                </property>
+                <property name="text">
+                    <string>&lt;font size="+2"&gt;Complexe de la forme : a+bj&lt;/font&gt;</string>
+                </property>
+            </widget>
+            <widget class="QLabel">
+                <property name="name">
+                    <cstring>Commentaire</cstring>
+                </property>
+                <property name="geometry">
+                    <rect>
+                        <x>140</x>
+                        <y>320</y>
+                        <width>170</width>
+                        <height>30</height>
+                    </rect>
+                </property>
+                <property name="text">
+                    <string>&lt;font size="+2"&gt;Un complexe est attendu&lt;/font&gt;</string>
+                </property>
+            </widget>
+            <widget class="QLineEdit">
+                <property name="name">
+                    <cstring>LEImag</cstring>
+                </property>
+                <property name="geometry">
+                    <rect>
+                        <x>240</x>
+                        <y>250</y>
+                        <width>170</width>
+                        <height>31</height>
+                    </rect>
+                </property>
+            </widget>
+            <widget class="QLineEdit">
+                <property name="name">
+                    <cstring>LEReel</cstring>
+                </property>
+                <property name="geometry">
+                    <rect>
+                        <x>50</x>
+                        <y>250</y>
+                        <width>170</width>
+                        <height>31</height>
+                    </rect>
+                </property>
+            </widget>
+            <widget class="QLineEdit">
+                <property name="name">
+                    <cstring>LEcomp</cstring>
+                </property>
+                <property name="geometry">
+                    <rect>
+                        <x>50</x>
+                        <y>60</y>
+                        <width>360</width>
+                        <height>40</height>
+                    </rect>
+                </property>
+            </widget>
+            <widget class="QButtonGroup">
+                <property name="name">
+                    <cstring>buttonGroup1</cstring>
+                </property>
+                <property name="geometry">
+                    <rect>
+                        <x>50</x>
+                        <y>160</y>
+                        <width>360</width>
+                        <height>70</height>
+                    </rect>
+                </property>
+                <property name="title">
+                    <string>OU</string>
+                </property>
+                <widget class="QRadioButton">
+                    <property name="name">
+                        <cstring>RBMP</cstring>
+                    </property>
+                    <property name="geometry">
+                        <rect>
+                            <x>10</x>
+                            <y>40</y>
+                            <width>330</width>
+                            <height>21</height>
+                        </rect>
+                    </property>
+                    <property name="text">
+                        <string>MP     : Module                                                                          Phase</string>
+                    </property>
+                </widget>
+                <widget class="QRadioButton">
+                    <property name="name">
+                        <cstring>RBRI</cstring>
+                    </property>
+                    <property name="geometry">
+                        <rect>
+                            <x>10</x>
+                            <y>20</y>
+                            <width>330</width>
+                            <height>21</height>
+                        </rect>
+                    </property>
+                    <property name="text">
+                        <string>RI   : Réel                                                                          Imaginaire</string>
+                    </property>
+                </widget>
+            </widget>
+        </widget>
+    </widget>
+</widget>
+<connections>
+    <connection>
+        <sender>bHelp</sender>
+        <signal>clicked()</signal>
+        <receiver>DUnComp</receiver>
+        <slot>ViewDoc()</slot>
+    </connection>
+    <connection>
+        <sender>bOk</sender>
+        <signal>clicked()</signal>
+        <receiver>DUnComp</receiver>
+        <slot>BOkPressed()</slot>
+    </connection>
+    <connection>
+        <sender>bSup</sender>
+        <signal>clicked()</signal>
+        <receiver>DUnComp</receiver>
+        <slot>BSupPressed()</slot>
+    </connection>
+    <connection>
+        <sender>LEImag</sender>
+        <signal>returnPressed()</signal>
+        <receiver>DUnComp</receiver>
+        <slot>LEImagRPressed()</slot>
+    </connection>
+    <connection>
+        <sender>LEReel</sender>
+        <signal>returnPressed()</signal>
+        <receiver>DUnComp</receiver>
+        <slot>LEReelRPressed()</slot>
+    </connection>
+    <connection>
+        <sender>LEcomp</sender>
+        <signal>returnPressed()</signal>
+        <receiver>DUnComp</receiver>
+        <slot>LEcompRPressed()</slot>
+    </connection>
+</connections>
+<slots>
+    <slot>BSupPressed()</slot>
+    <slot>ViewDoc()</slot>
+    <slot>BOkPressed()</slot>
+    <slot>LEImagRPressed()</slot>
+    <slot>LEReelRPressed()</slot>
+    <slot>LEcompRPressed()</slot>
+</slots>
+<layoutdefaults spacing="6" margin="11"/>
+</UI>
diff --git a/Ui/desUniqueInto.ui b/Ui/desUniqueInto.ui
new file mode 100644 (file)
index 0000000..6fa50f0
--- /dev/null
@@ -0,0 +1,211 @@
+<!DOCTYPE UI><UI version="3.3" stdsetdef="1">
+<class>DUnIn</class>
+<widget class="QWidget">
+    <property name="name">
+        <cstring>DUnIn</cstring>
+    </property>
+    <property name="geometry">
+        <rect>
+            <x>0</x>
+            <y>0</y>
+            <width>482</width>
+            <height>480</height>
+        </rect>
+    </property>
+    <property name="minimumSize">
+        <size>
+            <width>350</width>
+            <height>0</height>
+        </size>
+    </property>
+    <property name="caption">
+        <string>DUnIn</string>
+    </property>
+    <widget class="QTabWidget">
+        <property name="name">
+            <cstring>tabuniqueinto</cstring>
+        </property>
+        <property name="geometry">
+            <rect>
+                <x>20</x>
+                <y>20</y>
+                <width>450</width>
+                <height>440</height>
+            </rect>
+        </property>
+        <widget class="QWidget">
+            <property name="name">
+                <cstring>Widget8</cstring>
+            </property>
+            <attribute name="title">
+                <string>Saisir Valeur</string>
+            </attribute>
+            <widget class="QLabel">
+                <property name="name">
+                    <cstring>textLabel2</cstring>
+                </property>
+                <property name="geometry">
+                    <rect>
+                        <x>170</x>
+                        <y>30</y>
+                        <width>100</width>
+                        <height>21</height>
+                    </rect>
+                </property>
+                <property name="text">
+                    <string>&lt;b&gt;&lt;u&gt;&lt;p align="center"&gt;Valeurs possibles&lt;/p&gt;&lt;/u&gt;&lt;/b&gt;</string>
+                </property>
+            </widget>
+            <widget class="QLabel">
+                <property name="name">
+                    <cstring>textLabel1</cstring>
+                </property>
+                <property name="geometry">
+                    <rect>
+                        <x>170</x>
+                        <y>-10</y>
+                        <width>90</width>
+                        <height>31</height>
+                    </rect>
+                </property>
+                <property name="text">
+                    <string>&lt;p align="center"&gt;Choisir une valeur&lt;/p&gt;</string>
+                </property>
+            </widget>
+            <widget class="QLabel">
+                <property name="name">
+                    <cstring>Commentaire</cstring>
+                </property>
+                <property name="geometry">
+                    <rect>
+                        <x>38</x>
+                        <y>316</y>
+                        <width>381</width>
+                        <height>41</height>
+                    </rect>
+                </property>
+                <property name="text">
+                    <string></string>
+                </property>
+            </widget>
+            <widget class="QPushButton">
+                <property name="name">
+                    <cstring>bHelp</cstring>
+                </property>
+                <property name="geometry">
+                    <rect>
+                        <x>0</x>
+                        <y>370</y>
+                        <width>142</width>
+                        <height>30</height>
+                    </rect>
+                </property>
+                <property name="text">
+                    <string>&amp;Documentation</string>
+                </property>
+                <property name="accel">
+                    <string>Alt+D</string>
+                </property>
+                <property name="autoDefault">
+                    <bool>true</bool>
+                </property>
+                <property name="toolTip" stdset="0">
+                    <string>affichage documentation aster</string>
+                </property>
+            </widget>
+            <widget class="QListBox">
+                <property name="name">
+                    <cstring>listBoxVal</cstring>
+                </property>
+                <property name="geometry">
+                    <rect>
+                        <x>80</x>
+                        <y>60</y>
+                        <width>290</width>
+                        <height>240</height>
+                    </rect>
+                </property>
+            </widget>
+            <widget class="QPushButton">
+                <property name="name">
+                    <cstring>bOk</cstring>
+                </property>
+                <property name="geometry">
+                    <rect>
+                        <x>150</x>
+                        <y>370</y>
+                        <width>142</width>
+                        <height>30</height>
+                    </rect>
+                </property>
+                <property name="text">
+                    <string>&amp;Valider</string>
+                </property>
+                <property name="accel">
+                    <string>Shift+A, Alt+A, Alt+A, Alt+A</string>
+                </property>
+                <property name="autoDefault">
+                    <bool>true</bool>
+                </property>
+                <property name="default">
+                    <bool>true</bool>
+                </property>
+                <property name="toolTip" stdset="0">
+                    <string>validation de la saisie</string>
+                </property>
+            </widget>
+            <widget class="QPushButton">
+                <property name="name">
+                    <cstring>bSup</cstring>
+                </property>
+                <property name="geometry">
+                    <rect>
+                        <x>300</x>
+                        <y>370</y>
+                        <width>142</width>
+                        <height>30</height>
+                    </rect>
+                </property>
+                <property name="text">
+                    <string>&amp;Supprimer</string>
+                </property>
+                <property name="accel">
+                    <string>Alt+S</string>
+                </property>
+                <property name="autoDefault">
+                    <bool>true</bool>
+                </property>
+                <property name="toolTip" stdset="0">
+                    <string>suppression du mot clef</string>
+                </property>
+            </widget>
+        </widget>
+    </widget>
+</widget>
+<connections>
+    <connection>
+        <sender>bHelp</sender>
+        <signal>clicked()</signal>
+        <receiver>DUnIn</receiver>
+        <slot>ViewDoc()</slot>
+    </connection>
+    <connection>
+        <sender>bOk</sender>
+        <signal>clicked()</signal>
+        <receiver>DUnIn</receiver>
+        <slot>BOkPressed()</slot>
+    </connection>
+    <connection>
+        <sender>bSup</sender>
+        <signal>clicked()</signal>
+        <receiver>DUnIn</receiver>
+        <slot>BSupPressed()</slot>
+    </connection>
+</connections>
+<slots>
+    <slot>BSupPressed()</slot>
+    <slot>ViewDoc()</slot>
+    <slot>BOkPressed()</slot>
+</slots>
+<layoutdefaults spacing="6" margin="11"/>
+</UI>
diff --git a/Ui/desUniqueIntoPanel.py b/Ui/desUniqueIntoPanel.py
new file mode 100644 (file)
index 0000000..b48c58b
--- /dev/null
@@ -0,0 +1,90 @@
+# -*- coding: utf-8 -*-
+
+# Form implementation generated from reading ui file 'desUniqueInto.ui'
+#
+# Created: mar mar 20 12:00:55 2007
+#      by: The PyQt User Interface Compiler (pyuic) 3.13
+#
+# WARNING! All changes made in this file will be lost!
+
+
+from qt import *
+
+
+class DUnIn(QWidget):
+    def __init__(self,parent = None,name = None,fl = 0):
+        QWidget.__init__(self,parent,name,fl)
+
+        if not name:
+            self.setName("DUnIn")
+
+        self.setMinimumSize(QSize(350,0))
+        self.tabuniqueinto = QTabWidget(self,"tabuniqueinto")
+        self.tabuniqueinto.setGeometry(QRect(20,20,450,440))
+
+        self.Widget8 = QWidget(self.tabuniqueinto,"Widget8")
+
+        self.textLabel2 = QLabel(self.Widget8,"textLabel2")
+        self.textLabel2.setGeometry(QRect(170,30,100,21))
+
+        self.textLabel1 = QLabel(self.Widget8,"textLabel1")
+        self.textLabel1.setGeometry(QRect(170,-10,90,31))
+
+        self.Commentaire = QLabel(self.Widget8,"Commentaire")
+        self.Commentaire.setGeometry(QRect(38,316,381,41))
+
+        self.bHelp = QPushButton(self.Widget8,"bHelp")
+        self.bHelp.setGeometry(QRect(0,370,142,30))
+        self.bHelp.setAutoDefault(1)
+
+        self.listBoxVal = QListBox(self.Widget8,"listBoxVal")
+        self.listBoxVal.setGeometry(QRect(80,60,290,240))
+
+        self.bOk = QPushButton(self.Widget8,"bOk")
+        self.bOk.setGeometry(QRect(150,370,142,30))
+        self.bOk.setAutoDefault(1)
+        self.bOk.setDefault(1)
+
+        self.bSup = QPushButton(self.Widget8,"bSup")
+        self.bSup.setGeometry(QRect(300,370,142,30))
+        self.bSup.setAutoDefault(1)
+        self.tabuniqueinto.insertTab(self.Widget8,QString(""))
+
+        self.languageChange()
+
+        self.resize(QSize(482,480).expandedTo(self.minimumSizeHint()))
+        self.clearWState(Qt.WState_Polished)
+
+        self.connect(self.bHelp,SIGNAL("clicked()"),self.ViewDoc)
+        self.connect(self.bOk,SIGNAL("clicked()"),self.BOkPressed)
+        self.connect(self.bSup,SIGNAL("clicked()"),self.BSupPressed)
+
+
+    def languageChange(self):
+        self.setCaption(self.__tr("DUnIn"))
+        self.textLabel2.setText(self.__tr("<b><u><p align=\"center\">Valeurs possibles</p></u></b>"))
+        self.textLabel1.setText(self.__tr("<p align=\"center\">Choisir une valeur</p>"))
+        self.Commentaire.setText(QString.null)
+        self.bHelp.setText(self.__tr("&Documentation"))
+        self.bHelp.setAccel(self.__tr("Alt+D"))
+        QToolTip.add(self.bHelp,self.__tr("affichage documentation aster"))
+        self.bOk.setText(self.__tr("&Valider"))
+        self.bOk.setAccel(self.__tr("Shift+A, Alt+A, Alt+A, Alt+A"))
+        QToolTip.add(self.bOk,self.__tr("validation de la saisie"))
+        self.bSup.setText(self.__tr("&Supprimer"))
+        self.bSup.setAccel(self.__tr("Alt+S"))
+        QToolTip.add(self.bSup,self.__tr("suppression du mot clef"))
+        self.tabuniqueinto.changeTab(self.Widget8,self.__tr("Saisir Valeur"))
+
+
+    def BSupPressed(self):
+        print "DUnIn.BSupPressed(): Not implemented yet"
+
+    def ViewDoc(self):
+        print "DUnIn.ViewDoc(): Not implemented yet"
+
+    def BOkPressed(self):
+        print "DUnIn.BOkPressed(): Not implemented yet"
+
+    def __tr(self,s,c = None):
+        return qApp.translate("DUnIn",s,c)
diff --git a/Ui/myMain.ui b/Ui/myMain.ui
new file mode 100644 (file)
index 0000000..863e7fc
--- /dev/null
@@ -0,0 +1,607 @@
+<!DOCTYPE UI><UI version="3.3" stdsetdef="1">
+<class>Eficas</class>
+<widget class="QMainWindow">
+    <property name="name">
+        <cstring>Eficas</cstring>
+    </property>
+    <property name="enabled">
+        <bool>true</bool>
+    </property>
+    <property name="geometry">
+        <rect>
+            <x>0</x>
+            <y>0</y>
+            <width>902</width>
+            <height>575</height>
+        </rect>
+    </property>
+    <property name="sizePolicy">
+        <sizepolicy>
+            <hsizetype>1</hsizetype>
+            <vsizetype>1</vsizetype>
+            <horstretch>0</horstretch>
+            <verstretch>0</verstretch>
+        </sizepolicy>
+    </property>
+    <property name="minimumSize">
+        <size>
+            <width>21</width>
+            <height>323</height>
+        </size>
+    </property>
+    <property name="backgroundOrigin">
+        <enum>WidgetOrigin</enum>
+    </property>
+    <property name="font">
+        <font>
+        </font>
+    </property>
+    <property name="caption">
+        <string>Eficas </string>
+    </property>
+    <widget class="Line">
+        <property name="name">
+            <cstring>line1</cstring>
+        </property>
+        <property name="geometry">
+            <rect>
+                <x>-30</x>
+                <y>-10</y>
+                <width>930</width>
+                <height>20</height>
+            </rect>
+        </property>
+        <property name="frameShape">
+            <enum>HLine</enum>
+        </property>
+        <property name="frameShadow">
+            <enum>Sunken</enum>
+        </property>
+        <property name="orientation">
+            <enum>Horizontal</enum>
+        </property>
+    </widget>
+</widget>
+<menubar>
+    <property name="name">
+        <cstring>MenuBar</cstring>
+    </property>
+    <property name="margin">
+        <number>2</number>
+    </property>
+    <item text="&amp;Fichier" name="Fichier">
+        <action name="fileNewAction"/>
+        <action name="fileNewViewAction"/>
+        <action name="fileOpenAction"/>
+        <action name="fileSaveAction"/>
+        <action name="fileSaveAsAction"/>
+        <action name="fileCloseAction"/>
+        <action name="fileCloseAllAction"/>
+        <separator/>
+        <separator/>
+        <action name="fileExitAction"/>
+    </item>
+    <item text="&amp;Edition" name="Edition">
+        <separator/>
+        <action name="editCutAction"/>
+        <action name="editCopyAction"/>
+        <action name="editPasteAction"/>
+        <separator/>
+        <action name="editFindAction"/>
+    </item>
+    <item text="JdC" name="JdC">
+        <action name="jdcRapportDeValidationAction"/>
+        <action name="jdcFichierSourceAction"/>
+    </item>
+    <item text="Options" name="Options">
+    </item>
+    <item text="&amp;Aide" name="Aide">
+    </item>
+    <item text="Traduction" name="Traduction">
+        <action name="traductionnew_itemAction"/>
+    </item>
+    <item text="Patrons" name="Patrons">
+    </item>
+</menubar>
+<toolbars>
+    <toolbar dock="2">
+        <property name="name">
+            <cstring>toolBar</cstring>
+        </property>
+        <property name="frameShape">
+            <enum>MenuBarPanel</enum>
+        </property>
+        <property name="horizontallyStretchable">
+            <bool>false</bool>
+        </property>
+        <property name="label">
+            <string>Tools</string>
+        </property>
+        <action name="fileNewAction"/>
+        <action name="fileSaveAction"/>
+        <action name="fileOpenAction"/>
+        <action name="fileSaveAsAction"/>
+        <action name="editCutAction"/>
+        <action name="editPasteAction"/>
+        <action name="editFindAction"/>
+        <action name="fileExitAction"/>
+        <separator/>
+    </toolbar>
+</toolbars>
+<actions>
+    <action>
+        <property name="name">
+            <cstring>fileNewAction</cstring>
+        </property>
+        <property name="iconSet">
+            <iconset>image0</iconset>
+        </property>
+        <property name="text">
+            <string>New</string>
+        </property>
+        <property name="menuText">
+            <string>&amp;New</string>
+        </property>
+        <property name="accel">
+            <string>Ctrl+N</string>
+        </property>
+    </action>
+    <action>
+        <property name="name">
+            <cstring>fileOpenAction</cstring>
+        </property>
+        <property name="iconSet">
+            <iconset>image1</iconset>
+        </property>
+        <property name="text">
+            <string>Open</string>
+        </property>
+        <property name="menuText">
+            <string>&amp;Open...</string>
+        </property>
+        <property name="accel">
+            <string>Ctrl+O</string>
+        </property>
+    </action>
+    <action>
+        <property name="name">
+            <cstring>fileSaveAction</cstring>
+        </property>
+        <property name="iconSet">
+            <iconset>image2</iconset>
+        </property>
+        <property name="text">
+            <string>Save</string>
+        </property>
+        <property name="menuText">
+            <string>&amp;Save</string>
+        </property>
+        <property name="accel">
+            <string>Ctrl+S</string>
+        </property>
+    </action>
+    <action>
+        <property name="name">
+            <cstring>fileSaveAsAction</cstring>
+        </property>
+        <property name="text">
+            <string>Save As</string>
+        </property>
+        <property name="menuText">
+            <string>Save &amp;As...</string>
+        </property>
+        <property name="accel">
+            <string></string>
+        </property>
+    </action>
+    <action>
+        <property name="name">
+            <cstring>fileExitAction</cstring>
+        </property>
+        <property name="text">
+            <string>Exit</string>
+        </property>
+        <property name="menuText">
+            <string>E&amp;xit</string>
+        </property>
+        <property name="accel">
+            <string></string>
+        </property>
+    </action>
+    <action>
+        <property name="name">
+            <cstring>editUndoAction</cstring>
+        </property>
+        <property name="iconSet">
+            <iconset>image3</iconset>
+        </property>
+        <property name="text">
+            <string>Undo</string>
+        </property>
+        <property name="menuText">
+            <string>&amp;Undo</string>
+        </property>
+        <property name="accel">
+            <string>Ctrl+Z</string>
+        </property>
+    </action>
+    <action>
+        <property name="name">
+            <cstring>editRedoAction</cstring>
+        </property>
+        <property name="iconSet">
+            <iconset>image4</iconset>
+        </property>
+        <property name="text">
+            <string>Redo</string>
+        </property>
+        <property name="menuText">
+            <string>&amp;Redo</string>
+        </property>
+        <property name="accel">
+            <string>Ctrl+Y</string>
+        </property>
+    </action>
+    <action>
+        <property name="name">
+            <cstring>editCutAction</cstring>
+        </property>
+        <property name="iconSet">
+            <iconset>image5</iconset>
+        </property>
+        <property name="text">
+            <string>Cut</string>
+        </property>
+        <property name="menuText">
+            <string>Cu&amp;t</string>
+        </property>
+        <property name="accel">
+            <string>Ctrl+X</string>
+        </property>
+    </action>
+    <action>
+        <property name="name">
+            <cstring>editCopyAction</cstring>
+        </property>
+        <property name="iconSet">
+            <iconset>image6</iconset>
+        </property>
+        <property name="text">
+            <string>Copy</string>
+        </property>
+        <property name="menuText">
+            <string>&amp;Copy</string>
+        </property>
+        <property name="accel">
+            <string>Ctrl+C</string>
+        </property>
+    </action>
+    <action>
+        <property name="name">
+            <cstring>editPasteAction</cstring>
+        </property>
+        <property name="iconSet">
+            <iconset>image7</iconset>
+        </property>
+        <property name="text">
+            <string>Paste</string>
+        </property>
+        <property name="menuText">
+            <string>&amp;Paste</string>
+        </property>
+        <property name="accel">
+            <string>Ctrl+V</string>
+        </property>
+    </action>
+    <action>
+        <property name="name">
+            <cstring>editFindAction</cstring>
+        </property>
+        <property name="iconSet">
+            <iconset>image8</iconset>
+        </property>
+        <property name="text">
+            <string>Find</string>
+        </property>
+        <property name="menuText">
+            <string>&amp;Find...</string>
+        </property>
+        <property name="accel">
+            <string>Ctrl+F</string>
+        </property>
+    </action>
+    <action>
+        <property name="name">
+            <cstring>helpContentsAction</cstring>
+        </property>
+        <property name="text">
+            <string>Contents</string>
+        </property>
+        <property name="menuText">
+            <string>&amp;Contents...</string>
+        </property>
+        <property name="accel">
+            <string></string>
+        </property>
+    </action>
+    <action>
+        <property name="name">
+            <cstring>helpIndexAction</cstring>
+        </property>
+        <property name="text">
+            <string>Index</string>
+        </property>
+        <property name="menuText">
+            <string>&amp;Index...</string>
+        </property>
+        <property name="accel">
+            <string></string>
+        </property>
+    </action>
+    <action>
+        <property name="name">
+            <cstring>helpAboutAction</cstring>
+        </property>
+        <property name="text">
+            <string>About</string>
+        </property>
+        <property name="menuText">
+            <string>&amp;About</string>
+        </property>
+        <property name="accel">
+            <string></string>
+        </property>
+    </action>
+    <action>
+        <property name="name">
+            <cstring>traductionnew_itemAction</cstring>
+        </property>
+        <property name="text">
+            <string>new item</string>
+        </property>
+        <property name="menuText">
+            <string>new item</string>
+        </property>
+    </action>
+    <action>
+        <property name="name">
+            <cstring>fileSaveCloseAction</cstring>
+        </property>
+        <property name="text">
+            <string>Close</string>
+        </property>
+        <property name="menuText">
+            <string>Close</string>
+        </property>
+    </action>
+    <action>
+        <property name="name">
+            <cstring>fileCloseAction</cstring>
+        </property>
+        <property name="text">
+            <string>Close</string>
+        </property>
+        <property name="menuText">
+            <string>Close</string>
+        </property>
+        <property name="accel">
+            <string>Ctrl+W</string>
+        </property>
+    </action>
+    <action>
+        <property name="name">
+            <cstring>fileNewViewAction</cstring>
+        </property>
+        <property name="text">
+            <string>New view</string>
+        </property>
+    </action>
+    <action>
+        <property name="name">
+            <cstring>fileCloseAllAction</cstring>
+        </property>
+        <property name="text">
+            <string>Close All</string>
+        </property>
+        <property name="menuText">
+            <string>Close All</string>
+        </property>
+    </action>
+    <action>
+        <property name="name">
+            <cstring>jdcRapportDeValidationAction</cstring>
+        </property>
+        <property name="text">
+            <string>Rapport de validation</string>
+        </property>
+        <property name="menuText">
+            <string>Rapport de validation</string>
+        </property>
+        <property name="accel">
+            <string>Ctrl+R</string>
+        </property>
+    </action>
+    <action>
+        <property name="name">
+            <cstring>jdcFichierSourceAction</cstring>
+        </property>
+        <property name="text">
+            <string>Fichier source</string>
+        </property>
+        <property name="menuText">
+            <string>Fichier source</string>
+        </property>
+        <property name="accel">
+            <string>Ctrl+B</string>
+        </property>
+    </action>
+</actions>
+<images>
+    <image name="image0">
+        <data format="PNG" length="173">89504e470d0a1a0a0000000d4948445200000016000000160806000000c4b46c3b0000007449444154388dedd5c109c0200c05d06fe936812c10b2ffdd85d25385b6a991480f053f081af0291210f828c5a9d9c4de96cd2b9ad9eb0000660e2fe0c2519839c4f70c4c446d5e6b3538cf928245e4b2f6f014acaa8fda1d4fc1a5741b22079f9d111d96ea8a912c78c10bee64e60719f57e9203ad452a04cc4e50200000000049454e44ae426082</data>
+    </image>
+    <image name="image1">
+        <data format="PNG" length="210">89504e470d0a1a0a0000000d4948445200000016000000160806000000c4b46c3b0000009949444154388ded94410e85200c445f89c7367f61bc775d2848a42860ffced9548bbe8e13043e1d928177f481a123dc2b34f6f47a3de2b865a8843f4001982a0b3d5f62c58300aa1ad70550449ab9d507a773a8a4ba4f92a2df333c64c63bebbd82e5b8addecbcc7820eb4266c639745dfa80f36faf66c66fa19c3f882fb470ec05cdc0bed07893f68e171492635f686c3eeff6ba3c8fdd366dc4c0452c8781f8080000000049454e44ae426082</data>
+    </image>
+    <image name="image2">
+        <data format="PNG" length="217">89504e470d0a1a0a0000000d4948445200000016000000160806000000c4b46c3b000000a049444154388dd5954d0a802010859fd14668e18de662d222bc98376a21b4ac451992c66469e0b7f187f1f11c47052a218e762daddbfb9e99f6568f80b5364b8588ce35440400e80a398ce8f99034d2292cc37c8ebd530feb583a05e954341f8a027b2a7d3a1f09bf854dc5d5d953aa396e4f38cab199e2d2e108abe156f82e30977fcb4d8ff942d75dbebed2e143953a93f6caad3d6111f44b7d4f820ff9c0069bb51ecded318c5c0000000049454e44ae426082</data>
+    </image>
+    <image name="image3">
+        <data format="PNG" length="172">89504e470d0a1a0a0000000d4948445200000016000000160806000000c4b46c3b0000007349444154388ded92c10e80200840b1ef661d1cff4d876aa888a17669f9360f283ed80060f159425f3a71f53602e08e992b098801d02854176ae47f21ce1fb5b05d38eddc9060d0f11379635b3bc92bd518e239a943ec1d5ab7785cee107be4b215af4091f894de47181ecea59ede9ec59f380062ac28b1e3d701d90000000049454e44ae426082</data>
+    </image>
+    <image name="image4">
+        <data format="PNG" length="173">89504e470d0a1a0a0000000d4948445200000016000000160806000000c4b46c3b0000007449444154388ded92c10ac02008406ddf2d3b84ffed0ea3586a26d165e0830ea53e8504487e4b910f5489f19ea5a3ca0f8a896365b306c42dd613c649bdc2598316136219f0f936c0a2ef00d75a62614d3ab22996f2a362ffa337c5ebede962aad1a2e84aaaa2f750dd12748c0fd0ab9324677800596e28b1743f46860000000049454e44ae426082</data>
+    </image>
+    <image name="image5">
+        <data format="PNG" length="187">89504e470d0a1a0a0000000d4948445200000016000000160806000000c4b46c3b0000008249444154388dcdd341128020080550e8e02ebc38ad3273503e48537fe3e48c4f2425fa28e29c6f39920bf9276cb60185358877611388c2576418cda015f520b4e6b55be109dc0622b8e22acf31056e18dfdff80606aa551cc63564c4dcf80cd0201d577a5c85a8845fdc025ea5307afccd07e23a1df283ec2b37d9ad5fb4dfefd49cfbf72fac98c8cc890000000049454e44ae426082</data>
+    </image>
+    <image name="image6">
+        <data format="PNG" length="248">89504e470d0a1a0a0000000d4948445200000016000000160806000000c4b46c3b000000bf49444154388dd593410a83301045df488ee51dbc8c3ba98bf46a9eabd385350d266362444a3f0c4266fcf3f824f06f12402b66da8c55f3de2212cf9d92cb98c0ba2d7c4544cf9a07638bbad53c4491235ecf7cc1623697a92540c11ff4fda75275015d24a9389e7d6f53df4fe4ccab323eea0f03c0c4b2a0712ce6add89b59b7661c3be095985f261679ee4ebcc22c9788551fe6a2cbc4969a894bcb6f23ee361aab62e252c57294dfbfb610bbf2c897b8a46cc6677eaa519571fa087ea83762da9abacb20235f0000000049454e44ae426082</data>
+    </image>
+    <image name="image7">
+        <data format="PNG" length="270">89504e470d0a1a0a0000000d4948445200000016000000160806000000c4b46c3b000000d549444154388dc5955d0a84300c8427e2a90a9e6c8b0f4b3dd982d7ca3e58d7fe4cd0ba5d7640024df265da0a057e2439c9eb8d9eaa8841a0c9aad8c82ab32f9c425be1e30e0dcf00c00308f0b3a7a07410a9d7142e00b42c5a5fab696b979b1c837fc0c316b6e4165b64f78d716359919bdc4570de47c04732dd5e5bcc35f0c97762ae787936dccf7513577e79f48c4b27aa0f1327b240f5117fcbe348aa33b6e0224b054d0746b8025e2e3b3e73cde0dd1c97f02e8ed9d0af1db381224bdf33eee698a934a0f617b45540d00bcf4ca08fc0dff406e325c1981bc418760000000049454e44ae426082</data>
+    </image>
+    <image name="image8">
+        <data format="PNG" length="662">89504e470d0a1a0a0000000d4948445200000016000000160806000000c4b46c3b0000025d49444154388dd593a172db4010863f670a56ecc42278d0653693a0c21c68d6c2e60df21a818111349499c254a8329b55f0e089ddb15ba602b79d6692d699b6d399fee86e67e7db7f77efe07fd3e2c74bd775b3730eef3d5115002382b5166b2d5757578b1729bf02b76d3b0f8703b92d58aed7600400ef1ce3c70306a8aa8aebebeb57c117dfa06ddb525dd754efb600a82a49138a123532ec3ac42b9bcde655ce2ffabe9f87c340fde13dcb4d8daaa24e48ee12c6823808c107969b1a8a9ce3f1f8aa515c38e7c8ada5aa6b00c45f129c67d223938c88e6c860d118b1d592d139baae9bcf83a78965b5465134801b1d2e1f4945c0e350096408ea154490c2e0bd3fef5853c2e486a0019f4d84f58418418362b0408e8b23c924501093314dd359f01b809814112025144015f1964c0bbc1b484b07e4688880c029ebd78e4141f5b434fd76864c053f1e084b0f8580265440634044ce838bbcc03987a61350a3a2285e1d5a4414d0708aa598082162ad3d0fb6d6e287cfa498508d274050447370428c91af8d10fd4481608c390b5e00dcddddcd8e80a9de420248e804840856f03e02907d729465c9ba5ae3468731e6a79fe50260b55a6102c4ee40a6894c33f2cb0cb106512814f8f899b22cb9b9b959b8d1f1f8f848d334b46dfbe29bfe5eadeffbf9783c323a871881ecb4200d1151a8eb9aed76bb00188661eeba8efd7e8f3186ed76cb6ab57ae2fe591b5dd7cdde7b628c8808799e63ada5aaaa67b9bbdd6e6e9a06ef3d755d3f29fec7eafb7ebebdbd9dadb5735996f3fdfdfdfca2e3dfd5c3c3c3dc340dd334b1d96cfe1e184e63dceff7a494fe26f61fe90bbc4c5e59d614caf40000000049454e44ae426082</data>
+    </image>
+</images>
+<connections>
+    <connection>
+        <sender>fileNewAction</sender>
+        <signal>activated()</signal>
+        <receiver>Eficas</receiver>
+        <slot>fileNew()</slot>
+    </connection>
+    <connection>
+        <sender>fileOpenAction</sender>
+        <signal>activated()</signal>
+        <receiver>Eficas</receiver>
+        <slot>fileOpen()</slot>
+    </connection>
+    <connection>
+        <sender>fileSaveAction</sender>
+        <signal>activated()</signal>
+        <receiver>Eficas</receiver>
+        <slot>fileSave()</slot>
+    </connection>
+    <connection>
+        <sender>fileSaveAsAction</sender>
+        <signal>activated()</signal>
+        <receiver>Eficas</receiver>
+        <slot>fileSaveAs()</slot>
+    </connection>
+    <connection>
+        <sender>fileExitAction</sender>
+        <signal>activated()</signal>
+        <receiver>Eficas</receiver>
+        <slot>fileExit()</slot>
+    </connection>
+    <connection>
+        <sender>editUndoAction</sender>
+        <signal>activated()</signal>
+        <receiver>Eficas</receiver>
+        <slot>editUndo()</slot>
+    </connection>
+    <connection>
+        <sender>editRedoAction</sender>
+        <signal>activated()</signal>
+        <receiver>Eficas</receiver>
+        <slot>editRedo()</slot>
+    </connection>
+    <connection>
+        <sender>editCutAction</sender>
+        <signal>activated()</signal>
+        <receiver>Eficas</receiver>
+        <slot>editCut()</slot>
+    </connection>
+    <connection>
+        <sender>editPasteAction</sender>
+        <signal>activated()</signal>
+        <receiver>Eficas</receiver>
+        <slot>editPaste()</slot>
+    </connection>
+    <connection>
+        <sender>editFindAction</sender>
+        <signal>activated()</signal>
+        <receiver>Eficas</receiver>
+        <slot>editFind()</slot>
+    </connection>
+    <connection>
+        <sender>helpIndexAction</sender>
+        <signal>activated()</signal>
+        <receiver>Eficas</receiver>
+        <slot>helpIndex()</slot>
+    </connection>
+    <connection>
+        <sender>helpContentsAction</sender>
+        <signal>activated()</signal>
+        <receiver>Eficas</receiver>
+        <slot>helpContents()</slot>
+    </connection>
+    <connection>
+        <sender>helpAboutAction</sender>
+        <signal>activated()</signal>
+        <receiver>Eficas</receiver>
+        <slot>helpAbout()</slot>
+    </connection>
+    <connection>
+        <sender>fileCloseAction</sender>
+        <signal>activated()</signal>
+        <receiver>Eficas</receiver>
+        <slot>fileClose()</slot>
+    </connection>
+    <connection>
+        <sender>fileNewViewAction</sender>
+        <signal>activated()</signal>
+        <receiver>Eficas</receiver>
+        <slot>fileNewView()</slot>
+    </connection>
+    <connection>
+        <sender>fileCloseAllAction</sender>
+        <signal>activated()</signal>
+        <receiver>Eficas</receiver>
+        <slot>fileCloseAll()</slot>
+    </connection>
+    <connection>
+        <sender>editCopyAction</sender>
+        <signal>activated()</signal>
+        <receiver>Eficas</receiver>
+        <slot>editCopy()</slot>
+    </connection>
+    <connection>
+        <sender>jdcRapportDeValidationAction</sender>
+        <signal>activated()</signal>
+        <receiver>Eficas</receiver>
+        <slot>jdcRapport()</slot>
+    </connection>
+    <connection>
+        <sender>jdcFichierSourceAction</sender>
+        <signal>activated()</signal>
+        <receiver>Eficas</receiver>
+        <slot>jdcFichierSource()</slot>
+    </connection>
+</connections>
+<slots>
+    <slot>fileNew()</slot>
+    <slot>fileOpen()</slot>
+    <slot>fileSave()</slot>
+    <slot>fileSaveAs()</slot>
+    <slot>filePrint()</slot>
+    <slot>fileExit()</slot>
+    <slot>editUndo()</slot>
+    <slot>editRedo()</slot>
+    <slot>jdcFichierSource()</slot>
+    <slot>fileNewView()</slot>
+    <slot>editPaste()</slot>
+    <slot>editFind()</slot>
+    <slot>helpIndex()</slot>
+    <slot>helpContents()</slot>
+    <slot>helpAbout()</slot>
+    <slot>fileClose()</slot>
+    <slot>fileCloseAll()</slot>
+    <slot>jdcRapport()</slot>
+    <slot>editCut()</slot>
+    <slot>editCopy()</slot>
+</slots>
+<layoutdefaults spacing="2" margin="2"/>
+</UI>