From: Pascale Noyret Date: Fri, 10 Aug 2007 14:05:03 +0000 (+0000) Subject: *** empty log message *** X-Git-Tag: V12QT_070810^0 X-Git-Url: http://git.salome-platform.org/gitweb/?a=commitdiff_plain;h=de1e130ad38a13409f8c9164681439704e4c3ba6;p=modules%2Feficas.git *** empty log message *** --- diff --git a/Aster/editeur.ini b/Aster/editeur.ini index de8d11dd..77ef4249 100644 --- a/Aster/editeur.ini +++ b/Aster/editeur.ini @@ -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') diff --git a/Aster/eficas_aster.py b/Aster/eficas_aster.py index 1d298b58..deaa5455 100755 --- a/Aster/eficas_aster.py +++ b/Aster/eficas_aster.py @@ -27,6 +27,6 @@ # Modules Eficas import prefs -from Editeur import eficas_go +from InterfaceTK import eficas_go eficas_go.lance_eficas() diff --git a/Aster/prefs.py b/Aster/prefs.py index 13b16d0d..bb3ff194 100644 --- a/Aster/prefs.py +++ b/Aster/prefs.py @@ -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','','Ctrl+N'), - ('Nouvel INCLUDE','newJDC_include'), - ('Ouvrir','openJDC','','Ctrl+O'), - ('Enregistrer','saveJDC','','Ctrl+S'), - ('Enregistrer sous','saveasJDC','','Ctrl+E'), - None, - ('Fermer','closeJDC','','Ctrl+W'), - ('Quitter','exitEFICAS','','Ctrl+Q'), - ] - ), - ('Edition',[ - ('Copier','copy','','Ctrl+C'), - ('Couper','cut','','Ctrl+X'), - ('Coller','paste','','Ctrl+V'), - ] - ), - ('Jeu de commandes',[ - ('Rapport de validation','visuCRJDC','','Ctrl+R'), - ('Fichier source','visu_txt_brut_JDC','','Ctrl+B'), - #('Paramètres Eficas','affichage_fichier_ini'), - ] - ), - ('Traduction',[ - ('Traduction v7 en v8','TraduitFichier','','Ctrl+T'), - ] - ), - ('Aide',[ - ('Aide EFICAS','aideEFICAS','','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 index 8fb95820..00000000 --- a/Editeur/Interp.py +++ /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( '', self.clearMsg) - self.text.bind( '', self.inputhandler) - self.text.bind( '', self.inputhandler) - self.text.bind( '', self.uphistory) - self.text.bind( '', self.downhistory) - self.text.bind( '', self.goto_sol) - self.text.bind( '', 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/Editeur/Objecttreeitem.py b/Editeur/Objecttreeitem.py index 21998b57..e8067302 100644 --- a/Editeur/Objecttreeitem.py +++ b/Editeur/Objecttreeitem.py @@ -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() diff --git a/Editeur/Patrons/limaillage.comm b/Editeur/Patrons/limaillage.comm index bb12c443..c3817331 100644 --- a/Editeur/Patrons/limaillage.comm +++ b/Editeur/Patrons/limaillage.comm @@ -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 index c0cc0d07..00000000 --- a/Editeur/TroisDPal.py +++ /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) - diff --git a/Editeur/__init__.py b/Editeur/__init__.py index 28da2d3d..1260b69a 100644 --- a/Editeur/__init__.py +++ b/Editeur/__init__.py @@ -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 index 140d4493..00000000 --- a/Editeur/appli.py +++ /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 index e4287b75..00000000 --- a/Editeur/basestyle.py +++ /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 index 51c4e3a4..00000000 --- a/Editeur/browser.py +++ /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 index b1a408d5..00000000 --- a/Editeur/bureau.py +++ /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',''), - ('Ouvrir','openJDC',''), - ('Enregistrer','saveJDC',''), - ('Enregistrer sous','saveasJDC',''), - None, - ('Fermer','closeJDC',''), - ('Quitter','exitEFICAS',''), - ] - ), - ('Edition',[ - ('Copier','copy',''), - ('Couper','cut',''), - ('Coller','paste',''), - ] - ), - ('Jeu de commandes',[ - ('Rapport de validation','visuCRJDC',''), - ('Fichier à plat','visu_a_plat',''), - ('Fichier .py','visuJDC_py'), - ('Fichier source','visu_txt_brut_JDC',''), - ('Paramètres Eficas','affichage_fichier_ini'), - ('Mots-clés inconnus','mc_inconnus'), - ] - ), - ('Traduction',[ - ('Traduction v7 en v8','TraduitFichier','','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("",lambda e,s=self:s.selectArbreDown()) - self.nb.bind_all("",lambda e,s=self:s.selectArbreUp()) - self.nb.bind_all("",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 index e1ed7fcc..00000000 --- a/Editeur/catabrowser.py +++ /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 index cac0254d..00000000 --- a/Editeur/cataediteur.py +++ /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("",lambda e,s=self:s.execConcept()) - self._any.bind("",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 = (("",self.selectFilsCmd), - ("",self.deselectFilsCmd), - ("",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 = (("",self.selectCmd), - ("",self.deselectCmd), - ("",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("",lambda e,s=self : s.set_valeur_attribut('nom',None)) - self.e_nom.bind("",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("",lambda e,s=self : s.set_valeur_attribut('defaut',None)) - self.e_defaut.bind("",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("",lambda e,s=self : s.set_valeur_attribut('val_min',None)) - self.e_val_min.bind("",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("",lambda e,s=self : s.set_valeur_attribut('val_max',None)) - self.e_val_max.bind("",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 index 4acca2e4..00000000 --- a/Editeur/centerwindow.py +++ /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 index 8b0a4bca..00000000 --- a/Editeur/change_comm.py +++ /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 - diff --git a/Editeur/comploader.py b/Editeur/comploader.py index c5a7c846..e49bc50a 100644 --- a/Editeur/comploader.py +++ b/Editeur/comploader.py @@ -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 index df539df0..00000000 --- a/Editeur/compobase.py +++ /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 index d2f2f3ac..00000000 --- a/Editeur/compobloc.py +++ /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 index f0fdca5c..00000000 --- a/Editeur/compocomm.py +++ /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 index bbc3a47a..00000000 --- a/Editeur/compocommandecomm.py +++ /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 index 814782c8..00000000 --- a/Editeur/compoerror.py +++ /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 index 51b36738..00000000 --- a/Editeur/compofact.py +++ /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 index d134713b..00000000 --- a/Editeur/compoformule.py +++ /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("",self.verif_nom) - self.entry_nom.bind("",self.verif_nom) - self.entry_arg.bind("",self.verif_arguments) - self.entry_arg.bind("",self.verif_arguments) - self.entry_exp.bind("",self.verif_corps) - self.entry_exp.bind("",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 index 8572c13f..00000000 --- a/Editeur/compojdc.py +++ /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("", lambda e,s=self,a=bulle_aide : s.parent.appli.affiche_aide(e,a)) - Liste.MCbox.bind("",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 index ba423070..00000000 --- a/Editeur/compomacro.py +++ /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 index ae92e03a..00000000 --- a/Editeur/compomclist.py +++ /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 index 0a74d55c..00000000 --- a/Editeur/componiveau.py +++ /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 index 5098b97c..00000000 --- a/Editeur/componuplet.py +++ /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("", - lambda e,obj=obj,s=self:s.valid_valeur(e,obj=obj)) - entry.bind("", - 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 index 2fcbfff9..00000000 --- a/Editeur/compooper.py +++ /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 index 98f7a7c1..00000000 --- a/Editeur/compoparam.py +++ /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("",lambda e,s=self : s.entry_val.focus()) - self.entry_val.bind("",lambda e,s=self : s.change_valeur()) - self.entry_nom.bind("",lambda e,s=self : s.entry_val.focus()) - self.entry_val.bind("",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 index 41c6e291..00000000 --- a/Editeur/compoparameval.py +++ /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("",lambda e,s=self : s.verif_nom()) - self.entry_val.bind("",lambda e,s=self : s.verif_eval()) - self.entry_nom.bind("",lambda e,s=self : s.verif_nom()) - self.entry_val.bind("",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("",lambda e,s=self : s.bouton_val.invoke()) - self.bouton_val.bind("",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 index cb24795a..00000000 --- a/Editeur/compoproc.py +++ /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 index 7be5ba46..00000000 --- a/Editeur/composimp.py +++ /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 - diff --git a/Editeur/configuration.py b/Editeur/configuration.py index 91697925..cca88569 100644 --- a/Editeur/configuration.py +++ b/Editeur/configuration.py @@ -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 index 156ea489..00000000 --- a/Editeur/definition_cata.py +++ /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 index caf47fb8..00000000 --- a/Editeur/eficas.py +++ /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 index 84e8e7a2..00000000 --- a/Editeur/eficas_go.py +++ /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 index 6ff3db51..00000000 --- a/Editeur/eficas_test.py +++ /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 index 30764b53..00000000 --- a/Editeur/faq.py +++ /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 index b087c34e..00000000 --- a/Editeur/faqs.txt +++ /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 index 35b118ac..00000000 --- a/Editeur/fenetre_mc_inconnus.py +++ /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("",lambda event,en=e,m=mc,s=self : s.select_mc(m,en)) - #e.bind("",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 index a5661581..00000000 --- a/Editeur/fonctionpanel.py +++ /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("",lambda e,s=self,a=bulle_aide : s.parent.appli.affiche_aide(e,a)) - fram.bind("",self.parent.appli.efface_aide) - - # création des objets dans les frames - liste_commandes_valeurs = (("",self.selectValeur), - ("",self.deselectValeur), - ("",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 index 8e158927..00000000 --- a/Editeur/fontes.py +++ /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 index 00000000..1260b69a --- /dev/null +++ b/Editeur/icons/__init__.py @@ -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 index 00000000..ff59051f 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 index 9cdfa19a..00000000 --- a/Editeur/images.py +++ /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={} - diff --git a/Editeur/import_code.py b/Editeur/import_code.py index 942c6b4a..5dc27ac5 100644 --- a/Editeur/import_code.py +++ b/Editeur/import_code.py @@ -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 index c5a3eeba..00000000 --- a/Editeur/jdcdisplay.py +++ /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 index 9a9843f8..00000000 --- a/Editeur/listeFichiers.py +++ /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() diff --git a/Editeur/listePatrons.py b/Editeur/listePatrons.py index 307abbbe..690adb40 100644 --- a/Editeur/listePatrons.py +++ b/Editeur/listePatrons.py @@ -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 index 464d59a8..00000000 --- a/Editeur/macrodisplay.py +++ /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 index b1aea087..00000000 --- a/Editeur/menubar.py +++ /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 index ea414a03..00000000 --- a/Editeur/newsimppanel.py +++ /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 index 9d0da1e4..00000000 --- a/Editeur/options.py +++ /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 index 636473a1..00000000 --- a/Editeur/panels.py +++ /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("",lambda e,s=self,num=0:s.commande_up(num)) - self.nb.bind_all("",lambda e,s=self,num=1:s.commande_up(num)) - self.nb.bind_all("",lambda e,s=self,num=2:s.commande_up(num)) - self.nb.bind_all("",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("") - OngletPanel.panelbind.unbind_all("") - OngletPanel.panelbind.unbind_all("") - OngletPanel.panelbind.unbind_all("") - 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("",lambda e,s=self:s.execConcept()) - self._any.bind("",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 pour valider""" - page.bind("", lambda e,s=self,a=bulle_aide : s.parent.appli.affiche_aide(e,a)) - page.bind("",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 = (("",self.selectMC), - ("",self.deselectMC), - ("",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("", lambda e,s=self,a=bulle_aide : s.parent.appli.affiche_aide(e,a)) - Liste.MCbox.bind("",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 = (("",self.selectCmd), - ("",self.deselectCmd), - ("",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+(("",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("", lambda e,s=self,a=bulle_aide : s.parent.appli.affiche_aide(e,a)) - Liste.MCbox.bind("",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 = (("",self.selectCmd), - ("",self.deselectCmd), - ("",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+(("",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("", lambda e,s=self,a=bulle_aide : s.parent.appli.affiche_aide(e,a)) - Liste.MCbox.bind("",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("", lambda e,s=self,a=bulle_aide : s.parent.appli.affiche_aide(e,a)) - Liste.MCbox.bind("",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 index 6381ba7e..00000000 --- a/Editeur/panelsSalome.py +++ /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 index 0bd2fc4c..00000000 --- a/Editeur/patches.py +++ /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 index 88eea05d..00000000 --- a/Editeur/plusieursassdpanel.py +++ /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 = (("",self.selectValeur), - ("",self.deselectValeur), - ("",self.sup_valeur_sans_into)) - liste_commandes_choix = (("",self.selectChoix), - ("",self.deselectChoix), - ("",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("",lambda e,s=self,a=bulle_aide : s.parent.appli.affiche_aide(e,a)) - fram.bind("",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 index 38831dc1..00000000 --- a/Editeur/plusieursbasepanel.py +++ /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("",lambda e,s=self,a=bulle_aide : s.parent.appli.affiche_aide(e,a)) - fram.bind("",self.parent.appli.efface_aide) - - # création des objets dans les frames - liste_commandes_valeurs = (("",self.selectValeur), - ("",self.deselectValeur), - ("",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 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("",lambda e,c=command:c()) - self.entry.bind("",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 = (("",self.selectValeur), - ("",self.deselectValeur), - ("",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("",lambda e,s=self,a=bulle_aide: s.parent.appli.affiche_aide(e,a)) - fram.bind("",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 index 1854e865..00000000 --- a/Editeur/plusieursintopanel.py +++ /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 = (("",self.selectValeur), - ("",self.deselectValeur), - ("",self.sup_valeur)) - liste_commandes_choix = (("",self.selectChoix), - ("",self.deselectChoix), - ("",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("",lambda e,s=self,a=bulle_aide : s.parent.appli.affiche_aide(e,a)) - fram.bind("",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 index ba641445..00000000 --- a/Editeur/plusieurspanel.py +++ /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 index 1555f388..00000000 --- a/Editeur/readercata.py +++ /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] diff --git a/Editeur/session.py b/Editeur/session.py index 421584a5..980af6cd 100644 --- a/Editeur/session.py +++ b/Editeur/session.py @@ -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 index 0f929484..00000000 --- a/Editeur/shellpanel.py +++ /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 index 2918ddfe..00000000 --- a/Editeur/splash.py +++ /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 index e3b809b8..00000000 --- a/Editeur/statusbar.py +++ /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 index dd90ee60..00000000 --- a/Editeur/styles.py +++ /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 index 74248a09..00000000 --- a/Editeur/toolbar.py +++ /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("",lambda e,s=self,but=b,t=texte : s.affiche_balloon(e,but,t,pos='right')) - b.bind("", 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("",lambda e,s=self,but=b,t=texte : s.affiche_balloon(e,but,t)) - b.bind("", self.efface_balloon) - b.bind("", 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 index 18fbabb5..00000000 --- a/Editeur/tooltip.py +++ /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("", self._enter)) - self.bindings.append(self.widget.bind("", self._leave)) - self.bindings.append(self.widget.bind("", 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("", self.bindings[0]) - self.widget.unbind("", self.bindings[1]) - self.widget.unbind("", 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 index f007f450..00000000 --- a/Editeur/treeitemincanvas.py +++ /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 index a0c3be10..00000000 --- a/Editeur/treewidget.py +++ /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("", self.page_up) - self.id_down=self.canvas.bind("", self.page_down) - self.id_um=self.canvas.bind("", self.mot_up) - self.id_dm=self.canvas.bind("", 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("",self.id_up) - self.canvas.unbind("",self.id_down) - self.canvas.unbind("",self.id_um) - self.canvas.unbind("",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("",self.enter) - self.leave_id=self.label.bind("",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("",self.enter_id) - self.label.unbind("",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 index bc777b76..00000000 --- a/Editeur/uniqueassdpanel.py +++ /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("",lambda e,s=self,a=bulle_aide : s.parent.appli.affiche_aide(e,a)) - self.frame_valeur.bind("",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("",lambda e,c=self.valid_valeur_reel:c()) - self.entry.bind("",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 index 5517defa..00000000 --- a/Editeur/uniquebasepanel.py +++ /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("",lambda e,s=self,a=bulle_aide : s.parent.appli.affiche_aide(e,a)) - self.frame_valeur.bind("",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("",lambda e,c=self.valid_valeur:c()) - self.entry.bind("",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 """ - - 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 index 3aa09074..00000000 --- a/Editeur/uniquecomppanel.py +++ /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("",lambda e,s=self,a=bulle_aide : s.parent.appli.affiche_aide(e,a)) - self.frame_valeur.bind("",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("",lambda e,s=self:s.entry2.component('entry').focus()) - self.entry1.component('entry').bind("",lambda e,s=self:s.entry2.component('entry').focus()) - self.entry2.component('entry').bind("",lambda e,c=self.valid_valeur:c()) - self.entry2.component('entry').bind("",lambda e,c=self.valid_valeur:c()) - self.entry3.component('entry').bind("",lambda e,c=self.valid_complexe:c()) - self.entry3.component('entry').bind("",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 index 6532e3fa..00000000 --- a/Editeur/uniqueintopanel.py +++ /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("",lambda e,s=self,a=bulle_aide : - s.parent.appli.affiche_aide(e,a)) - self.frame_valeur.bind("",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 = (("",self.selectChoix), - ("",self.deselectChoix), - ("",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 index a622b8a6..00000000 --- a/Editeur/uniquepanel.py +++ /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 index 6c3f1fc4..00000000 --- a/Editeur/uniquesdcopanel.py +++ /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("",lambda e,s=self,a=bulle_aide : s.parent.appli.affiche_aide(e,a)) - self.frame_valeur.bind("",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("",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('',self.valid_nom_concept_co) - self.entry_co.bind('',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 index 83c51ffc..00000000 --- a/Editeur/widgets.py +++ /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("", self.page_up) - self.zone_texte.bind("", self.page_down) - self.zone_texte.bind("", self.unit_up) - self.zone_texte.bind("", 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('',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("", self.page_up) - self.zone_texte.bind("", self.page_down) - self.zone_texte.bind("", self.unit_up) - self.zone_texte.bind("", 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("", self.page_up) - self.zone_texte.bind("", self.page_down) - self.zone_texte.bind("", self.unit_up) - self.zone_texte.bind("", 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("",lambda e,s=self,c=self.liste_commandes[2][1],x=objet,l=label : s.chooseitemsurligne(x,l,c)) - label.bind("",lambda e,s=self,c=self.liste_commandes[2][1],x=objet,l=label : s.chooseitemsurligne(x,l,c)) - label.bind("",lambda e,s=self,x=objet,l=label : s.selectNextItem(x,l)) - label.bind("",lambda e, s=self,x=objet,l=label : s.selectNextItem(x,l)) - label.bind("" ,lambda e,s=self,x=objet,l=label : s.selectPrevItem(x,l)) - label.bind("" ,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 == "": - 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 """ - 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 = (("",self.selectCmd), - ("",self.deselectCmd), - ("",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("",lambda e,s=self,c=null,x=cmd,l=label: s.selectitem(x,l,c)) - label.bind("",lambda e,s=self,c=null,x=cmd,l=label: s.deselectitem(l,x,c)) - label.bind("",lambda e,s=self,c=null,x=cmd,l=label: s.chooseitem(x,l,c)) - label.bind("",lambda e,s=self,c=null,x=cmd,l=label: s.chooseitem(x,l,c)) - label.bind("",lambda e,s=self,c=null,x=cmd,l=label: s.chooseitem(x,l,c)) - label.bind("",lambda e,s=self,c=null,x=cmd,l=label,gr=grp: s.selectNextItem(x,l,c,gr,x)) - label.bind("",lambda e,s=self,c=null,x=cmd,l=label,gr=grp: s.selectNextItem(x,l,c,gr,x)) - label.bind("",lambda e,s=self,c=null,x=cmd,l=label,gr=grp: s.selectPrevItem(x,l,c,gr,x)) - label.bind("",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 == "": - label.bind("",lambda e,s=self,c=callback,x=cmd,l=label: s.selectitem(x,l,c)) - elif event == "": - label.bind("",lambda e,s=self,c=callback,x=cmd,l=label: s.deselectitem(l,x,c)) - elif event == "": - label.bind("",lambda e,s=self,c=callback,x=cmd,l=label: s.chooseitem(x,l,c)) - elif event == "": - label.bind("",lambda e,s=self,c=callback,x=cmd,l=label: s.chooseitem(x,l,c)) - elif event == "": - label.bind("",lambda e,s=self,c=callback,x=cmd,l=label: s.chooseitem(x,l,c)) - elif event == "": - label.bind("",lambda e,s=self,c=callback,x=cmd,l=label,gr=grp:s.selectNextItem(x,l,c,gr,x)) - elif event == "": - label.bind("",lambda e,s=self,c=callback,x=cmd,l=label,gr=grp:s.selectNextItem(x,l,c,gr,x)) - elif event == "": - label.bind("",lambda e,s=self,c=callback,x=cmd,l=label,gr=grp:s.selectPrevItem(x,l,c,gr,x)) - elif event == "": - label.bind("",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 == "": - 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 - """ - 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/Extensions/etape_niveau.py b/Extensions/etape_niveau.py index a51c5fff..2db15130 100644 --- a/Extensions/etape_niveau.py +++ b/Extensions/etape_niveau.py @@ -25,7 +25,7 @@ import traceback from Noyau import N_OBJECT -import prefs +from Aster import prefs class ETAPE_NIVEAU(N_OBJECT.OBJECT): diff --git a/Ihm/I_FORM_ETAPE.py b/Ihm/I_FORM_ETAPE.py index d228980c..79044d6b 100644 --- a/Ihm/I_FORM_ETAPE.py +++ b/Ihm/I_FORM_ETAPE.py @@ -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 index 00000000..21d22fbc --- /dev/null +++ b/InterfaceQT/__init__.py @@ -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 index 00000000..99e055bd --- /dev/null +++ b/InterfaceQT/browser.py @@ -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 index 00000000..ff386c51 --- /dev/null +++ b/InterfaceQT/compobloc.py @@ -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 index 00000000..4a12cfeb --- /dev/null +++ b/InterfaceQT/compocomm.py @@ -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 index 00000000..26f97a77 --- /dev/null +++ b/InterfaceQT/compofact.py @@ -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 index 00000000..d314ba1e --- /dev/null +++ b/InterfaceQT/compoformule.py @@ -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 index 00000000..288e4bec --- /dev/null +++ b/InterfaceQT/compojdc.py @@ -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 index 00000000..e59138f1 --- /dev/null +++ b/InterfaceQT/compomacro.py @@ -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 index 00000000..256f0f68 --- /dev/null +++ b/InterfaceQT/compomclist.py @@ -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 index 00000000..37b38b7f --- /dev/null +++ b/InterfaceQT/componiveau.py @@ -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 index 00000000..649ce0e2 --- /dev/null +++ b/InterfaceQT/componuplet.py @@ -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 index 00000000..5e84c736 --- /dev/null +++ b/InterfaceQT/compooper.py @@ -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 index 00000000..989c79c9 --- /dev/null +++ b/InterfaceQT/compoparam.py @@ -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 index 00000000..ff0d1b94 --- /dev/null +++ b/InterfaceQT/compoparameval.py @@ -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 index 00000000..862795f4 --- /dev/null +++ b/InterfaceQT/compoproc.py @@ -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 index 00000000..8f99baef --- /dev/null +++ b/InterfaceQT/composimp.py @@ -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 index 00000000..8a903ed9 --- /dev/null +++ b/InterfaceQT/editor.py @@ -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 %1 could not be saved.
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 %1 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 index 00000000..0a9c2a99 --- /dev/null +++ b/InterfaceQT/eficas.py @@ -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 index 00000000..f21aaa14 --- /dev/null +++ b/InterfaceQT/monChoixCata.py @@ -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 index 00000000..a15cc8a1 --- /dev/null +++ b/InterfaceQT/monCommandePanel.py @@ -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 index 00000000..ae6ce6e3 --- /dev/null +++ b/InterfaceQT/monCommentairePanel.py @@ -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 index 00000000..272c89af --- /dev/null +++ b/InterfaceQT/monFonctionPanel.py @@ -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 index 00000000..6fa2e588 --- /dev/null +++ b/InterfaceQT/monFormulePanel.py @@ -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 index 00000000..ccd3f6e3 --- /dev/null +++ b/InterfaceQT/monMCFactPanel.py @@ -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 index 00000000..622deab5 --- /dev/null +++ b/InterfaceQT/monMCListAjoutPanel.py @@ -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 index 00000000..b7905c2c --- /dev/null +++ b/InterfaceQT/monMacroPanel.py @@ -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 index 00000000..0b7a6412 --- /dev/null +++ b/InterfaceQT/monPlusieursASSDPanel.py @@ -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 index 00000000..f53f67f6 --- /dev/null +++ b/InterfaceQT/monPlusieursBasePanel.py @@ -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 index 00000000..7aa23d7c --- /dev/null +++ b/InterfaceQT/monPlusieursIntoPanel.py @@ -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 index 00000000..c36411ac --- /dev/null +++ b/InterfaceQT/monRacinePanel.py @@ -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 index 00000000..7bc1cdfb --- /dev/null +++ b/InterfaceQT/monUniqueASSDPanel.py @@ -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 index 00000000..8e83ec86 --- /dev/null +++ b/InterfaceQT/monUniqueBasePanel.py @@ -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 index 00000000..e47f2940 --- /dev/null +++ b/InterfaceQT/monUniqueCompPanel.py @@ -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 index 00000000..144dc700 --- /dev/null +++ b/InterfaceQT/monUniqueIntoPanel.py @@ -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 index 00000000..697e5b47 --- /dev/null +++ b/InterfaceQT/myMain_ui.py @@ -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 index 00000000..cc2125fe --- /dev/null +++ b/InterfaceQT/panelsQT.py @@ -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 index 00000000..dd04a650 --- /dev/null +++ b/InterfaceQT/politiquesValidation.py @@ -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 index 00000000..ef1aa899 --- /dev/null +++ b/InterfaceQT/prefsQT.py @@ -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 index 00000000..d0502605 --- /dev/null +++ b/InterfaceQT/qtCommun.py @@ -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 %1 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 %1 could not be saved.
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 index 00000000..a94621b3 --- /dev/null +++ b/InterfaceQT/qtEficas.py @@ -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 index 00000000..3ec98d3d --- /dev/null +++ b/InterfaceQT/qtSaisie.py @@ -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 index 00000000..2fbe686b --- /dev/null +++ b/InterfaceQT/readercata.py @@ -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 index 00000000..9f111468 --- /dev/null +++ b/InterfaceQT/typeNode.py @@ -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 index 00000000..d52fbc50 --- /dev/null +++ b/InterfaceQT/utilIcons.py @@ -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 index 00000000..c06e9c2b --- /dev/null +++ b/InterfaceQT/viewManager.py @@ -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( + """Search""" + """

Search for some text in the current editor. A""" + """ dialog is shown to enter the searchtext and options""" + """ for the search.

""" + )) + 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( + """Search again""" + """

Search again for some text in the current editor.""" + """ The previously entered searchtext and options are reused.

""" + )) + 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( + """Replace""" + """

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.

""" + )) + 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( + """Goto Line""" + """

Go to a specific line of text in the current editor.""" + """ A dialog is shown to enter the linenumber.

""" + )) + 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( + """Goto Brace""" + """

Go to the matching brace in the current editor.

""" + )) + 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( + """Search in Files""" + """

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.

""" + )) + 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( + """Zoom in""" + """

Zoom in on the text. This makes the text bigger.

""" + )) + 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( + """Zoom out""" + """

Zoom out on the text. This makes the text smaller.

""" + )) + 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( + """Zoom""" + """

Zoom the text. This opens a dialog where the""" + """ desired size can be entered.

""" + )) + 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( + """Toggle all folds""" + """

Toggle all folds of the current editor.

""" + )) + self.connect(self.toggleAllAct,SIGNAL('activated()'),self.handleToggleAll) + self.viewActions.append(self.toggleAllAct) + + self.toggleCurrentAct = QAction(self.trUtf8('Toggle current fold'), + self.trUtf8('Toggle ¤t fold'), + 0, self.viewFoldActGrp) + self.toggleCurrentAct.setStatusTip(self.trUtf8('Toggle current fold')) + self.toggleCurrentAct.setWhatsThis(self.trUtf8( + """Toggle current fold""" + """

Toggle the folds of the current line of the current editor.

""" + )) + 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( + """Remove all highlights""" + """

Remove the highlights of all editors.

""" + )) + 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( + """Split view""" + """

Add a split to the view.

""" + )) + 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( + """Arrange horizontally""" + """

Arrange the splitted views horizontally.

""" + )) + 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( + """Remove split""" + """

Remove the current split.

""" + )) + 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( + """Start Macro Recording""" + """

Start recording editor commands into a new macro.

""" + )) + 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( + """Stop Macro Recording""" + """

Stop recording editor commands into a new macro.

""" + )) + 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( + """Run Macro""" + """

Run a previously recorded editor macro.

""" + )) + 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( + """Delete Macro""" + """

Delete a previously recorded editor macro.

""" + )) + 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( + """Load Macro""" + """

Load an editor macro from a file.

""" + )) + 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( + """Save Macro""" + """

Save a previously recorded editor macro to a file.

""" + )) + 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 %1 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 +
    +
  • reread the colours for the syntax highlighting
  • +
  • reloads the already created API objetcs
  • +
  • starts or stops the autosave timer
  • +
  • Note: changes in viewmanager type are activated + on an application restart.
  • +
+ """ + # 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:
+ 1: Directory of currently active editor
+ 2: Directory of currently active Project
+ 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:
+ 1: Directory of currently active editor
+ 2: Directory of currently active Project
+ 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 index 00000000..675bc29b --- /dev/null +++ b/InterfaceQT/visualisation.py @@ -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 index 00000000..8fb95820 --- /dev/null +++ b/InterfaceTK/Interp.py @@ -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( '', self.clearMsg) + self.text.bind( '', self.inputhandler) + self.text.bind( '', self.inputhandler) + self.text.bind( '', self.uphistory) + self.text.bind( '', self.downhistory) + self.text.bind( '', self.goto_sol) + self.text.bind( '', 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 index 00000000..21998b57 --- /dev/null +++ b/InterfaceTK/Objecttreeitem.py @@ -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 index 00000000..c0cc0d07 --- /dev/null +++ b/InterfaceTK/TroisDPal.py @@ -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 index 00000000..28da2d3d --- /dev/null +++ b/InterfaceTK/__init__.py @@ -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 index 00000000..17e9b81f --- /dev/null +++ b/InterfaceTK/appli.py @@ -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 index 00000000..e4287b75 --- /dev/null +++ b/InterfaceTK/basestyle.py @@ -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 index 00000000..51c4e3a4 --- /dev/null +++ b/InterfaceTK/browser.py @@ -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 index 00000000..f9263e06 --- /dev/null +++ b/InterfaceTK/bureau.py @@ -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',''), + ('Ouvrir','openJDC',''), + ('Enregistrer','saveJDC',''), + ('Enregistrer sous','saveasJDC',''), + None, + ('Fermer','closeJDC',''), + ('Quitter','exitEFICAS',''), + ] + ), + ('Edition',[ + ('Copier','copy',''), + ('Couper','cut',''), + ('Coller','paste',''), + ] + ), + ('Jeu de commandes',[ + ('Rapport de validation','visuCRJDC',''), + ('Fichier à plat','visu_a_plat',''), + ('Fichier .py','visuJDC_py'), + ('Fichier source','visu_txt_brut_JDC',''), + ('Paramètres Eficas','affichage_fichier_ini'), + ('Mots-clés inconnus','mc_inconnus'), + ] + ), + ('Traduction',[ + ('Traduction v7 en v8','TraduitFichier','','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("",lambda e,s=self:s.selectArbreDown()) + self.nb.bind_all("",lambda e,s=self:s.selectArbreUp()) + self.nb.bind_all("",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 index 00000000..c3a38080 --- /dev/null +++ b/InterfaceTK/catabrowser.py @@ -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 index 00000000..6b51fe07 --- /dev/null +++ b/InterfaceTK/cataediteur.py @@ -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("",lambda e,s=self:s.execConcept()) + self._any.bind("",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 = (("",self.selectFilsCmd), + ("",self.deselectFilsCmd), + ("",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 = (("",self.selectCmd), + ("",self.deselectCmd), + ("",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("",lambda e,s=self : s.set_valeur_attribut('nom',None)) + self.e_nom.bind("",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("",lambda e,s=self : s.set_valeur_attribut('defaut',None)) + self.e_defaut.bind("",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("",lambda e,s=self : s.set_valeur_attribut('val_min',None)) + self.e_val_min.bind("",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("",lambda e,s=self : s.set_valeur_attribut('val_max',None)) + self.e_val_max.bind("",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 index 00000000..4acca2e4 --- /dev/null +++ b/InterfaceTK/centerwindow.py @@ -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 index 00000000..a664e27c --- /dev/null +++ b/InterfaceTK/change_comm.py @@ -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 index 00000000..a287b7d2 --- /dev/null +++ b/InterfaceTK/compobase.py @@ -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 index 00000000..e92d5199 --- /dev/null +++ b/InterfaceTK/compobloc.py @@ -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 index 00000000..2d96384a --- /dev/null +++ b/InterfaceTK/compocomm.py @@ -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 index 00000000..e51705c2 --- /dev/null +++ b/InterfaceTK/compocommandecomm.py @@ -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 index 00000000..74e0c46c --- /dev/null +++ b/InterfaceTK/compoerror.py @@ -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 index 00000000..0d984381 --- /dev/null +++ b/InterfaceTK/compofact.py @@ -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 index 00000000..a9a5a5fd --- /dev/null +++ b/InterfaceTK/compoformule.py @@ -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("",self.verif_nom) + self.entry_nom.bind("",self.verif_nom) + self.entry_arg.bind("",self.verif_arguments) + self.entry_arg.bind("",self.verif_arguments) + self.entry_exp.bind("",self.verif_corps) + self.entry_exp.bind("",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 index 00000000..fb9b7d76 --- /dev/null +++ b/InterfaceTK/compojdc.py @@ -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("", lambda e,s=self,a=bulle_aide : s.parent.appli.affiche_aide(e,a)) + Liste.MCbox.bind("",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 index 00000000..54a19c9a --- /dev/null +++ b/InterfaceTK/compomacro.py @@ -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 index 00000000..ba3704ca --- /dev/null +++ b/InterfaceTK/compomclist.py @@ -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 index 00000000..e96fea45 --- /dev/null +++ b/InterfaceTK/componiveau.py @@ -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 index 00000000..c14573d3 --- /dev/null +++ b/InterfaceTK/componuplet.py @@ -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("", + lambda e,obj=obj,s=self:s.valid_valeur(e,obj=obj)) + entry.bind("", + 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 index 00000000..f153122d --- /dev/null +++ b/InterfaceTK/compooper.py @@ -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 index 00000000..f842f44c --- /dev/null +++ b/InterfaceTK/compoparam.py @@ -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("",lambda e,s=self : s.entry_val.focus()) + self.entry_val.bind("",lambda e,s=self : s.change_valeur()) + self.entry_nom.bind("",lambda e,s=self : s.entry_val.focus()) + self.entry_val.bind("",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 index 00000000..23deafa3 --- /dev/null +++ b/InterfaceTK/compoparameval.py @@ -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("",lambda e,s=self : s.verif_nom()) + self.entry_val.bind("",lambda e,s=self : s.verif_eval()) + self.entry_nom.bind("",lambda e,s=self : s.verif_nom()) + self.entry_val.bind("",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("",lambda e,s=self : s.bouton_val.invoke()) + self.bouton_val.bind("",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 index 00000000..63fb490d --- /dev/null +++ b/InterfaceTK/compoproc.py @@ -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 index 00000000..6f9d7b98 --- /dev/null +++ b/InterfaceTK/composimp.py @@ -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 index 00000000..156ea489 --- /dev/null +++ b/InterfaceTK/definition_cata.py @@ -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 index 00000000..caf47fb8 --- /dev/null +++ b/InterfaceTK/eficas.py @@ -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 index 00000000..81e929f4 --- /dev/null +++ b/InterfaceTK/eficas_go.py @@ -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 index 00000000..2a5230cf --- /dev/null +++ b/InterfaceTK/eficas_test.py @@ -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 index 00000000..afa09fed --- /dev/null +++ b/InterfaceTK/faq.py @@ -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 index 00000000..b087c34e --- /dev/null +++ b/InterfaceTK/faqs.txt @@ -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 index 00000000..35b118ac --- /dev/null +++ b/InterfaceTK/fenetre_mc_inconnus.py @@ -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("",lambda event,en=e,m=mc,s=self : s.select_mc(m,en)) + #e.bind("",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 index 00000000..7b1646fc --- /dev/null +++ b/InterfaceTK/fonctionpanel.py @@ -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("",lambda e,s=self,a=bulle_aide : s.parent.appli.affiche_aide(e,a)) + fram.bind("",self.parent.appli.efface_aide) + + # création des objets dans les frames + liste_commandes_valeurs = (("",self.selectValeur), + ("",self.deselectValeur), + ("",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 index 00000000..8e158927 --- /dev/null +++ b/InterfaceTK/fontes.py @@ -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 index 00000000..08401ffd --- /dev/null +++ b/InterfaceTK/images.py @@ -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 index 00000000..c5a3eeba --- /dev/null +++ b/InterfaceTK/jdcdisplay.py @@ -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 index 00000000..9a9843f8 --- /dev/null +++ b/InterfaceTK/listeFichiers.py @@ -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 index 00000000..350749b1 --- /dev/null +++ b/InterfaceTK/listePatronsTK.py @@ -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 index 00000000..a0e7e8de --- /dev/null +++ b/InterfaceTK/macrodisplay.py @@ -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 index 00000000..b1aea087 --- /dev/null +++ b/InterfaceTK/menubar.py @@ -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 index 00000000..0a04ce0f --- /dev/null +++ b/InterfaceTK/newsimppanel.py @@ -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 index 00000000..9d0da1e4 --- /dev/null +++ b/InterfaceTK/options.py @@ -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 index 00000000..15ab8ca9 --- /dev/null +++ b/InterfaceTK/panels.py @@ -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("",lambda e,s=self,num=0:s.commande_up(num)) + self.nb.bind_all("",lambda e,s=self,num=1:s.commande_up(num)) + self.nb.bind_all("",lambda e,s=self,num=2:s.commande_up(num)) + self.nb.bind_all("",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("") + OngletPanel.panelbind.unbind_all("") + OngletPanel.panelbind.unbind_all("") + OngletPanel.panelbind.unbind_all("") + 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("",lambda e,s=self:s.execConcept()) + self._any.bind("",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 pour valider""" + page.bind("", lambda e,s=self,a=bulle_aide : s.parent.appli.affiche_aide(e,a)) + page.bind("",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 = (("",self.selectMC), + ("",self.deselectMC), + ("",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("", lambda e,s=self,a=bulle_aide : s.parent.appli.affiche_aide(e,a)) + Liste.MCbox.bind("",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 = (("",self.selectCmd), + ("",self.deselectCmd), + ("",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+(("",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("", lambda e,s=self,a=bulle_aide : s.parent.appli.affiche_aide(e,a)) + Liste.MCbox.bind("",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 = (("",self.selectCmd), + ("",self.deselectCmd), + ("",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+(("",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("", lambda e,s=self,a=bulle_aide : s.parent.appli.affiche_aide(e,a)) + Liste.MCbox.bind("",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("", lambda e,s=self,a=bulle_aide : s.parent.appli.affiche_aide(e,a)) + Liste.MCbox.bind("",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 index 00000000..6381ba7e --- /dev/null +++ b/InterfaceTK/panelsSalome.py @@ -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 index 00000000..0bd2fc4c --- /dev/null +++ b/InterfaceTK/patches.py @@ -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 index 00000000..3d77f39f --- /dev/null +++ b/InterfaceTK/plusieursassdpanel.py @@ -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 = (("",self.selectValeur), + ("",self.deselectValeur), + ("",self.sup_valeur_sans_into)) + liste_commandes_choix = (("",self.selectChoix), + ("",self.deselectChoix), + ("",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("",lambda e,s=self,a=bulle_aide : s.parent.appli.affiche_aide(e,a)) + fram.bind("",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 index 00000000..550b98eb --- /dev/null +++ b/InterfaceTK/plusieursbasepanel.py @@ -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("",lambda e,s=self,a=bulle_aide : s.parent.appli.affiche_aide(e,a)) + fram.bind("",self.parent.appli.efface_aide) + + # création des objets dans les frames + liste_commandes_valeurs = (("",self.selectValeur), + ("",self.deselectValeur), + ("",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 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("",lambda e,c=command:c()) + self.entry.bind("",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 = (("",self.selectValeur), + ("",self.deselectValeur), + ("",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("",lambda e,s=self,a=bulle_aide: s.parent.appli.affiche_aide(e,a)) + fram.bind("",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 index 00000000..3484a83a --- /dev/null +++ b/InterfaceTK/plusieursintopanel.py @@ -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 = (("",self.selectValeur), + ("",self.deselectValeur), + ("",self.sup_valeur)) + liste_commandes_choix = (("",self.selectChoix), + ("",self.deselectChoix), + ("",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("",lambda e,s=self,a=bulle_aide : s.parent.appli.affiche_aide(e,a)) + fram.bind("",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 index 00000000..b79906f6 --- /dev/null +++ b/InterfaceTK/plusieurspanel.py @@ -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 index 00000000..6590c55f --- /dev/null +++ b/InterfaceTK/prefsTK.py @@ -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','','Ctrl+N'), + ('Nouvel INCLUDE','newJDC_include'), + ('Ouvrir','openJDC','','Ctrl+O'), + ('Enregistrer','saveJDC','','Ctrl+S'), + ('Enregistrer sous','saveasJDC','','Ctrl+E'), + None, + ('Fermer','closeJDC','','Ctrl+W'), + ('Quitter','exitEFICAS','','Ctrl+Q'), + ] + ), + ('Edition',[ + ('Copier','copy','','Ctrl+C'), + ('Couper','cut','','Ctrl+X'), + ('Coller','paste','','Ctrl+V'), + ] + ), + ('Jeu de commandes',[ + ('Rapport de validation','visuCRJDC','','Ctrl+R'), + ('Fichier source','visu_txt_brut_JDC','','Ctrl+B'), + #('Paramètres Eficas','affichage_fichier_ini'), + ] + ), + ('Traduction',[ + ('Traduction v7 en v8','TraduitFichier','','Ctrl+T'), + ] + ), + ('Aide',[ + ('Aide EFICAS','aideEFICAS','','Ctrl+A'), + ] + ), + ] + } diff --git a/InterfaceTK/readercata.py b/InterfaceTK/readercata.py new file mode 100644 index 00000000..07c5ebf5 --- /dev/null +++ b/InterfaceTK/readercata.py @@ -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 index 00000000..b7682198 --- /dev/null +++ b/InterfaceTK/shellpanel.py @@ -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 index 00000000..f1deca69 --- /dev/null +++ b/InterfaceTK/splash.py @@ -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 index 00000000..e3b809b8 --- /dev/null +++ b/InterfaceTK/statusbar.py @@ -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 index 00000000..ead56a55 --- /dev/null +++ b/InterfaceTK/styles.py @@ -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 index 00000000..74248a09 --- /dev/null +++ b/InterfaceTK/toolbar.py @@ -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("",lambda e,s=self,but=b,t=texte : s.affiche_balloon(e,but,t,pos='right')) + b.bind("", 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("",lambda e,s=self,but=b,t=texte : s.affiche_balloon(e,but,t)) + b.bind("", self.efface_balloon) + b.bind("", 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 index 00000000..18fbabb5 --- /dev/null +++ b/InterfaceTK/tooltip.py @@ -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("", self._enter)) + self.bindings.append(self.widget.bind("", self._leave)) + self.bindings.append(self.widget.bind("", 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("", self.bindings[0]) + self.widget.unbind("", self.bindings[1]) + self.widget.unbind("", 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 index 00000000..05239c94 --- /dev/null +++ b/InterfaceTK/treeitemincanvas.py @@ -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 index 00000000..2cdae73f --- /dev/null +++ b/InterfaceTK/treewidget.py @@ -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("", self.page_up) + self.id_down=self.canvas.bind("", self.page_down) + self.id_um=self.canvas.bind("", self.mot_up) + self.id_dm=self.canvas.bind("", 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("",self.id_up) + self.canvas.unbind("",self.id_down) + self.canvas.unbind("",self.id_um) + self.canvas.unbind("",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("",self.enter) + self.leave_id=self.label.bind("",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("",self.enter_id) + self.label.unbind("",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 index 00000000..ad9ed244 --- /dev/null +++ b/InterfaceTK/uniqueassdpanel.py @@ -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("",lambda e,s=self,a=bulle_aide : s.parent.appli.affiche_aide(e,a)) + self.frame_valeur.bind("",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("",lambda e,c=self.valid_valeur_reel:c()) + self.entry.bind("",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 index 00000000..707fc285 --- /dev/null +++ b/InterfaceTK/uniquebasepanel.py @@ -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("",lambda e,s=self,a=bulle_aide : s.parent.appli.affiche_aide(e,a)) + self.frame_valeur.bind("",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("",lambda e,c=self.valid_valeur:c()) + self.entry.bind("",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 """ + + 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 index 00000000..b7fdf618 --- /dev/null +++ b/InterfaceTK/uniquecomppanel.py @@ -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("",lambda e,s=self,a=bulle_aide : s.parent.appli.affiche_aide(e,a)) + self.frame_valeur.bind("",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("",lambda e,s=self:s.entry2.component('entry').focus()) + self.entry1.component('entry').bind("",lambda e,s=self:s.entry2.component('entry').focus()) + self.entry2.component('entry').bind("",lambda e,c=self.valid_valeur:c()) + self.entry2.component('entry').bind("",lambda e,c=self.valid_valeur:c()) + self.entry3.component('entry').bind("",lambda e,c=self.valid_complexe:c()) + self.entry3.component('entry').bind("",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 index 00000000..5c6552b5 --- /dev/null +++ b/InterfaceTK/uniqueintopanel.py @@ -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("",lambda e,s=self,a=bulle_aide : + s.parent.appli.affiche_aide(e,a)) + self.frame_valeur.bind("",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 = (("",self.selectChoix), + ("",self.deselectChoix), + ("",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 index 00000000..4e3a6037 --- /dev/null +++ b/InterfaceTK/uniquepanel.py @@ -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 index 00000000..9722862c --- /dev/null +++ b/InterfaceTK/uniquesdcopanel.py @@ -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("",lambda e,s=self,a=bulle_aide : s.parent.appli.affiche_aide(e,a)) + self.frame_valeur.bind("",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("",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('',self.valid_nom_concept_co) + self.entry_co.bind('',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 index 00000000..d43053ba --- /dev/null +++ b/InterfaceTK/widgets.py @@ -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("", self.page_up) + self.zone_texte.bind("", self.page_down) + self.zone_texte.bind("", self.unit_up) + self.zone_texte.bind("", 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('',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("", self.page_up) + self.zone_texte.bind("", self.page_down) + self.zone_texte.bind("", self.unit_up) + self.zone_texte.bind("", 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("", self.page_up) + self.zone_texte.bind("", self.page_down) + self.zone_texte.bind("", self.unit_up) + self.zone_texte.bind("", 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("",lambda e,s=self,c=self.liste_commandes[2][1],x=objet,l=label : s.chooseitemsurligne(x,l,c)) + label.bind("",lambda e,s=self,c=self.liste_commandes[2][1],x=objet,l=label : s.chooseitemsurligne(x,l,c)) + label.bind("",lambda e,s=self,x=objet,l=label : s.selectNextItem(x,l)) + label.bind("",lambda e, s=self,x=objet,l=label : s.selectNextItem(x,l)) + label.bind("" ,lambda e,s=self,x=objet,l=label : s.selectPrevItem(x,l)) + label.bind("" ,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 == "": + 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 """ + 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 = (("",self.selectCmd), + ("",self.deselectCmd), + ("",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("",lambda e,s=self,c=null,x=cmd,l=label: s.selectitem(x,l,c)) + label.bind("",lambda e,s=self,c=null,x=cmd,l=label: s.deselectitem(l,x,c)) + label.bind("",lambda e,s=self,c=null,x=cmd,l=label: s.chooseitem(x,l,c)) + label.bind("",lambda e,s=self,c=null,x=cmd,l=label: s.chooseitem(x,l,c)) + label.bind("",lambda e,s=self,c=null,x=cmd,l=label: s.chooseitem(x,l,c)) + label.bind("",lambda e,s=self,c=null,x=cmd,l=label,gr=grp: s.selectNextItem(x,l,c,gr,x)) + label.bind("",lambda e,s=self,c=null,x=cmd,l=label,gr=grp: s.selectNextItem(x,l,c,gr,x)) + label.bind("",lambda e,s=self,c=null,x=cmd,l=label,gr=grp: s.selectPrevItem(x,l,c,gr,x)) + label.bind("",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 == "": + label.bind("",lambda e,s=self,c=callback,x=cmd,l=label: s.selectitem(x,l,c)) + elif event == "": + label.bind("",lambda e,s=self,c=callback,x=cmd,l=label: s.deselectitem(l,x,c)) + elif event == "": + label.bind("",lambda e,s=self,c=callback,x=cmd,l=label: s.chooseitem(x,l,c)) + elif event == "": + label.bind("",lambda e,s=self,c=callback,x=cmd,l=label: s.chooseitem(x,l,c)) + elif event == "": + label.bind("",lambda e,s=self,c=callback,x=cmd,l=label: s.chooseitem(x,l,c)) + elif event == "": + label.bind("",lambda e,s=self,c=callback,x=cmd,l=label,gr=grp:s.selectNextItem(x,l,c,gr,x)) + elif event == "": + label.bind("",lambda e,s=self,c=callback,x=cmd,l=label,gr=grp:s.selectNextItem(x,l,c,gr,x)) + elif event == "": + label.bind("",lambda e,s=self,c=callback,x=cmd,l=label,gr=grp:s.selectPrevItem(x,l,c,gr,x)) + elif event == "": + label.bind("",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 == "": + 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 + """ + 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 index 00000000..8446d25c --- /dev/null +++ b/Ui/desChoixCata.py @@ -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("Veuillez choisir celle avec laquelle vous souhaitez travailler")) + 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 index 00000000..66297798 --- /dev/null +++ b/Ui/desChoixCata.ui @@ -0,0 +1,168 @@ + +DChoixCata + + + DChoixCata + + + + 0 + 0 + 547 + 172 + + + + Choix d'une version du code Aster + + + true + + + + frame3 + + + + 0 + 120 + 540 + 50 + + + + StyledPanel + + + Raised + + + + buttonCancel + + + + 370 + 10 + 90 + 30 + + + + &Cancel + + + + + + true + + + + + buttonOk + + + + 80 + 10 + 90 + 30 + + + + &OK + + + + + + true + + + true + + + + + + textLabel1_2 + + + + 40 + 50 + 340 + 20 + + + + <font size="+1">Veuillez choisir celle avec laquelle vous souhaitez travailler</font> + + + + + CBChoixCata + + + true + + + + 400 + 41 + 101 + 30 + + + + + + TLNb + + + + 110 + 30 + 210 + 20 + + + + + 30 + 0 + + + + 2 + + + + + + buttonOk + clicked() + DChoixCata + BOkPressed() + + + buttonCancel + clicked() + DChoixCata + BCancelPressed() + + + CBChoixCata + textChanged(const QString&) + DChoixCata + CataChoisi() + + + + CataChoisi() + BOkPressed() + BCancelPressed() + + + diff --git a/Ui/desCommande.py b/Ui/desCommande.py new file mode 100644 index 00000000..9ae67ecb --- /dev/null +++ b/Ui/desCommande.py @@ -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("

Mots Clefs Permis

")) + 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("Nom du concept :")) + self.textLabel1_3_2.setText(self.__tr("Type du concept :")) + 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("Commandes :")) + 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 index 00000000..e8d3037b --- /dev/null +++ b/Ui/desCommande.ui @@ -0,0 +1,551 @@ + +DComm + + + DComm + + + + 0 + 0 + 505 + 483 + + + + + 505 + 0 + + + + DComm + + + + Commentaire + + + + 10 + 410 + 490 + 20 + + + + NoFrame + + + Plain + + + + + + + + bSup + + + + 320 + 440 + 142 + 30 + + + + &Supprimer + + + Alt+S + + + true + + + suppression du mot clef + + + + + bOk + + + + 170 + 440 + 142 + 30 + + + + &Valider + + + Shift+A, Alt+A, Alt+A, Alt+A + + + true + + + true + + + validation de la saisie + + + + + bHelp + + + + 10 + 440 + 142 + 30 + + + + &Documentation + + + Alt+D + + + true + + + affichage documentation aster + + + + + TWChoix + + + + 0 + 0 + 500 + 400 + + + + + MotClef + + + Ajouter Mot-Clef + + + + LBMCPermis + + + + 10 + 40 + 220 + 290 + + + + + 0 + 0 + + + + + + LBRegles + + + + 260 + 40 + 230 + 290 + + + + + + textLabel1 + + + + 50 + 10 + 140 + 20 + + + + + 0 + 0 + + + + <h3><p align="center"><u><b>Mots Clefs Permis</b></u></p></h3> + + + + + textLabel1_2 + + + + 360 + 0 + 50 + 37 + + + + <h3><p align="center"><u><b>Règles</b></u></p></h3> + + + + + + Concept + + + Nommer Concept + + + + groupBox1 + + + + 0 + 10 + 520 + 380 + + + + Concept + + + + textLabel1_3 + + + + 80 + 50 + 82 + 31 + + + + <u>Nom du concept :</u> + + + + + textLabel1_3_2 + + + + 80 + 170 + 82 + 31 + + + + <u>Type du concept :</u> + + + + + textLabel3 + + + + 80 + 200 + 230 + 31 + + + + L'opérateur courant retourne un concept de type : + + + + + LENomConcept + + + + 80 + 110 + 310 + 30 + + + + + + typeConcept + + + + 320 + 200 + 100 + 31 + + + + TypeDuConcept + + + + + + + Commande + + + Nouvelle Commande + + + + textLabel6 + + + + 10 + 60 + 60 + 30 + + + + Filtre + + + + + textLabel4 + + + + 90 + 340 + 300 + 30 + + + + La commande choisie sera ajoutée APRES la commande courante + + + + + LBNouvCommande + + + + 50 + 100 + 410 + 240 + + + + + + buttonGroup1 + + + + 298 + 17 + 151 + 70 + + + + Affichage + + + + RBGroupe + + + + 20 + 40 + 101 + 20 + + + + par groupe + + + + + RBalpha + + + + 20 + 20 + 101 + 20 + + + + alphabétique + + + true + + + + + + LEFiltre + + + + 50 + 60 + 160 + 30 + + + + + + BNext + + + + 220 + 60 + 30 + 31 + + + + + + + image0 + + + affiche la prochaine occurence + + + + + textLabel1_4 + + + + 50 + 20 + 171 + 21 + + + + <b><u>Commandes :</u></b> + + + + + + + + 89504e470d0a1a0a0000000d49484452000000210000000e0806000000a11e758c000000cf49444154388dd594db0ec3200c43edfdf8d897bb0f345b480845d51eb64888f412e76001c00f046fd6e99bba77200480924a1032c92efbd8c7d5cabcc025400099e957849568fe7f06c0ded1deb32b4a1ec4ea824b9e74097165bd01f85527f78a7201e0a3129f345a017c543bafdc983d0f7109d15a331b471f47072c17494a82338f6178203a8817e67306b1f08b07ba03e602c9b831077e37e0209e67e3386710977b17de80c185ad38695a51d522c82ce77912e2fed8be83762092f52b1820dd11bb10e565b53a5a3bbaff130713d66fa6981857060000000049454e44ae426082 + + + + + LBNouvCommande + clicked(QListBoxItem*) + DComm + LBNouvCommandeClicked() + + + LEFiltre + textChanged(const QString&) + DComm + LEFiltreTextChanged() + + + LEFiltre + returnPressed() + DComm + LEfiltreReturnPressed() + + + bSup + pressed() + DComm + BSupPressed() + + + bOk + clicked() + DComm + BOkPressed() + + + LENomConcept + returnPressed() + DComm + LENomConceptReturnPressed() + + + RBGroupe + clicked() + DComm + BuildTabCommand() + + + RBalpha + clicked() + DComm + BuildTabCommand() + + + bHelp + clicked() + DComm + BHelpPressed() + + + BNext + pressed() + DComm + BNextPressed() + + + + LBNouvCommandeClicked() + LEFiltreTextChanged() + LEfiltreReturnPressed() + BSupPressed() + LENomConceptReturnPressed() + BOkPressed() + BuildTabCommand() + BHelpPressed() + BNextPressed() + + + diff --git a/Ui/desCommentaire.py b/Ui/desCommentaire.py new file mode 100644 index 00000000..2f4ef35a --- /dev/null +++ b/Ui/desCommentaire.py @@ -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("

Texte du Commentaire

")) + 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 index 00000000..e161ac53 --- /dev/null +++ b/Ui/desCommentaire.ui @@ -0,0 +1,150 @@ + +DComment + + + DComment + + + + 0 + 0 + 475 + 480 + + + + + 350 + 0 + + + + Form1 + + + + bSup + + + + 310 + 420 + 142 + 30 + + + + &Supprimer + + + Alt+S + + + true + + + suppression du mot clef + + + + + bHelp + + + + 10 + 420 + 142 + 30 + + + + &Documentation + + + Alt+D + + + true + + + affichage documentation aster + + + + + textLabel1 + + + + 160 + 10 + 120 + 21 + + + + <p align="center"><b>Texte du Commentaire</b></p> + + + + + textCommentaire + + + + 10 + 40 + 451 + 360 + + + + + + bOk + + + + 160 + 420 + 142 + 30 + + + + &Valider + + + Shift+A, Alt+A, Alt+A, Alt+A + + + true + + + true + + + validation de la saisie + + + + + + textCommentaire + returnPressed() + DComment + TexteCommentaireEntre() + + + bOk + clicked() + DComment + TexteCommentaireEntre() + + + + TexteCommentaireEntre() + + + diff --git a/Ui/desFormule.py b/Ui/desFormule.py new file mode 100644 index 00000000..5c5aa32e --- /dev/null +++ b/Ui/desFormule.py @@ -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("

Arguments

")) + self.textLabel1.setText(self.__tr("

Nom de la formule

")) + 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("

Corps de la formule

")) + 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("

(

")) + self.textLabel2_2.setText(self.__tr("=")) + self.textLabel1_6_2.setText(self.__tr("

)

")) + 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("Commandes :")) + 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 index 00000000..5afefa16 --- /dev/null +++ b/Ui/desFormule.ui @@ -0,0 +1,577 @@ + +DFormule + + + DFormule + + + + 0 + 0 + 529 + 484 + + + + + 505 + 0 + + + + DMacro + + + + bSup + + + + 320 + 440 + 142 + 30 + + + + &Supprimer + + + Alt+S + + + true + + + suppression du mot clef + + + + + bHelp + + + + 10 + 440 + 142 + 30 + + + + &Documentation + + + Alt+D + + + true + + + affichage documentation aster + + + + + Commentaire + + + + -8 + 404 + 490 + 20 + + + + + + + + + bOk + + + + 170 + 440 + 142 + 30 + + + + &Valider + + + Shift+A, Alt+A, Alt+A, Alt+A + + + true + + + true + + + validation de la saisie + + + + + TWChoix + + + + 0 + 0 + 500 + 400 + + + + + Formule + + + Définition Formule + + + + textLabel1_2 + + + + 290 + 10 + 80 + 20 + + + + <h3><p align="center"><u><b>Arguments</b></u></p></h3> + + + + + textLabel1 + + + + 30 + 10 + 160 + 30 + + + + + 0 + 0 + + + + <h3><p align="center"><u><b>Nom de la formule</b></u></p></h3> + + + + + textLabel2 + + + + 220 + 40 + 220 + 20 + + + + variables séparées par des "," par ex. : x,y,z + + + + + textLabel1_5 + + + + 30 + 180 + 420 + 20 + + + + + 0 + 0 + + + + <h3><p align="center"><u><b>Corps de la formule</b></u></p></h3> + + + + + textLabel1_3_2 + + + + 28 + 306 + 401 + 31 + + + + Ce n'est qu'après avoir appuyé sur le bouton Valider que les nouvelles +vaelurs seront effectivement prises en compte + + + + + textLabel1_6 + + + + 210 + 60 + 20 + 50 + + + + <h1><b>(</b></h1> + + + + + textLabel2_2 + + + + 210 + 130 + 49 + 20 + + + + <font size="+4" face="Helvetica"><b>=</b></font> + + + + + textLabel1_6_2 + + + + 450 + 60 + 20 + 50 + + + + <h1><b>)</b></h1> + + + + + LENomFormule + + + + 30 + 70 + 171 + 31 + + + + + + LENomsArgs + + + + 220 + 70 + 230 + 31 + + + + + + textLabel1_3 + + + + 90 + 260 + 300 + 20 + + + + Retour-Chariot permet de vérifier que l'expression est valide. + + + + + LECorpsFormule + + + + 20 + 220 + 440 + 31 + + + + + + + Commande + + + Nouvelle Commande + + + + textLabel6 + + + + 10 + 60 + 60 + 30 + + + + Filtre + + + + + textLabel4 + + + + 90 + 340 + 300 + 30 + + + + La commande choisie sera ajoutée APRES la commande courante + + + + + LBNouvCommande + + + + 50 + 100 + 410 + 240 + + + + + + buttonGroup1 + + + + 300 + 20 + 151 + 70 + + + + Affichage + + + + RBGroupe + + + + 20 + 40 + 101 + 20 + + + + par groupe + + + + + RBalpha + + + + 20 + 20 + 101 + 20 + + + + alphabétique + + + true + + + + + + LEFiltre + + + + 50 + 60 + 160 + 30 + + + + + + textLabel1_4 + + + + 50 + 20 + 171 + 21 + + + + <b><u>Commandes :</u></b> + + + + + BNext + + + + 220 + 60 + 30 + 31 + + + + + + + image0 + + + affiche la prochaine occurence + + + + + + + + 89504e470d0a1a0a0000000d49484452000000210000000e0806000000a11e758c000000cf49444154388dd594db0ec3200c43edfdf8d897bb0f345b480845d51eb64888f412e76001c00f046fd6e99bba77200480924a1032c92efbd8c7d5cabcc025400099e957849568fe7f06c0ded1deb32b4a1ec4ea824b9e74097165bd01f85527f78a7201e0a3129f345a017c543bafdc983d0f7109d15a331b471f47072c17494a82338f6178203a8817e67306b1f08b07ba03e602c9b831077e37e0209e67e3386710977b17de80c185ad38695a51d522c82ce77912e2fed8be83762092f52b1820dd11bb10e565b53a5a3bbaff130713d66fa6981857060000000049454e44ae426082 + + + + + LBNouvCommande + clicked(QListBoxItem*) + DFormule + LBNouvCommandeClicked() + + + LEFiltre + textChanged(const QString&) + DFormule + LEFiltreTextChanged() + + + LEFiltre + returnPressed() + DFormule + LEfiltreReturnPressed() + + + bSup + pressed() + DFormule + BSupPressed() + + + bOk + clicked() + DFormule + BOkPressed() + + + RBalpha + clicked() + DFormule + BuildTabCommand() + + + RBGroupe + clicked() + DFormule + BuildTabCommand() + + + BNext + clicked() + DFormule + BNextPressed() + + + LENomFormule + returnPressed() + DFormule + NomFormuleSaisi() + + + LENomsArgs + returnPressed() + DFormule + argsSaisis() + + + LECorpsFormule + returnPressed() + DFormule + FormuleSaisie() + + + + LBNouvCommandeClicked() + LEFiltreTextChanged() + LEfiltreReturnPressed() + BSupPressed() + BOkPressed() + BuildTabCommand() + BNextPressed() + NomFormuleSaisi() + argsSaisis() + FormuleSaisie() + + + diff --git a/Ui/desInactif.py b/Ui/desInactif.py new file mode 100644 index 00000000..72b72ff5 --- /dev/null +++ b/Ui/desInactif.py @@ -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("

\n" +" DEBUT / POURSUITE et FIN\n" +"

")) + 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("

\n" +"sont actives\n" +"

")) + 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 index 00000000..c5a6b800 --- /dev/null +++ b/Ui/desInactif.ui @@ -0,0 +1,134 @@ + +DInactif + + + DInactif + + + + 0 + 0 + 482 + 480 + + + + + 350 + 0 + + + + + + + + textLabel1_4 + + + + 30 + 240 + 420 + 20 + + + + <font size="+2"><p align="center"> + DEBUT / POURSUITE et FIN +</p></font> + + + + + textLabel1 + + + + 30 + 220 + 420 + 20 + + + + <font size="+2"><p align="center"> +Seules les commandes placées entre : +</p></font> + + + + + textLabel1_4_2 + + + + 30 + 260 + 420 + 20 + + + + <font size="+2"><p align="center"> +sont actives +</p></font> + + + + + bSup + + + + 170 + 430 + 142 + 30 + + + + &Supprimer + + + Alt+S + + + true + + + suppression du mot clef + + + + + textLabel1_3 + + + + 20 + 130 + 420 + 20 + + + + <font size="+2"><p align="center">Le noeud sélectionné ne correspond pas à un objet actif.</p></font> + + + + + + bSup + clicked() + DInactif + BSupPressed() + + + + BSupPressed() + ViewDoc() + BOkPressed() + + + diff --git a/Ui/desMCFact.py b/Ui/desMCFact.py new file mode 100644 index 00000000..cc10c426 --- /dev/null +++ b/Ui/desMCFact.py @@ -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("

Mots Clefs Permis

")) + 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 index 00000000..6e7714a6 --- /dev/null +++ b/Ui/desMCFact.ui @@ -0,0 +1,234 @@ + +DMCFact + + + DMCFact + + + + 0 + 0 + 521 + 499 + + + + + 505 + 0 + + + + DMacro + + + + Commentaire + + + + 10 + 410 + 490 + 20 + + + + + + + + + bSup + + + + 320 + 440 + 142 + 30 + + + + &Supprimer + + + Alt+S + + + true + + + suppression du mot clef + + + + + bOk + + + + 170 + 440 + 142 + 30 + + + + &Valider + + + Shift+A, Alt+A, Alt+A, Alt+A + + + true + + + true + + + validation de la saisie + + + + + bHelp + + + + 10 + 440 + 142 + 30 + + + + &Documentation + + + Alt+D + + + true + + + affichage documentation aster + + + + + TWChoix + + + + 0 + 0 + 500 + 400 + + + + + MotClef + + + Ajouter Mot-Clef + + + + textLabel1_2 + + + + 360 + 0 + 50 + 37 + + + + <h3><p align="center"><u><b>Régles</b></u></p></h3> + + + + + LBRegles + + + + 260 + 40 + 230 + 290 + + + + + + LBMCPermis + + + + 10 + 40 + 220 + 290 + + + + + 0 + 0 + + + + + + textLabel1 + + + + 50 + 10 + 140 + 20 + + + + + 0 + 0 + + + + <h3><p align="center"><u><b>Mots Clefs Permis</b></u></p></h3> + + + + + + + + bSup + pressed() + DMCFact + BSupPressed() + + + bOk + clicked() + DMCFact + BOkPressed() + + + + LBNouvCommandeClicked() + LEFiltreTextChanged() + LEfiltreReturnPressed() + BSupPressed() + BOkPressed() + buildTabCommand() + BNextPressed() + + + diff --git a/Ui/desMCListAjout.py b/Ui/desMCListAjout.py new file mode 100644 index 00000000..61594a59 --- /dev/null +++ b/Ui/desMCListAjout.py @@ -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("

cliquez ci-dessous

")) + self.textLabel1.setText(self.__tr("

Pour ajouter une autre occurrence

")) + self.textLabel1_2.setText(self.__tr("

du mot clef-facteur

")) + self.MCFacteur.setText(self.__tr("

AFFE

")) + + + 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 index 00000000..935c7bd7 --- /dev/null +++ b/Ui/desMCListAjout.ui @@ -0,0 +1,220 @@ + +DMCListAjout + + + DMCListAjout + + + + 0 + 0 + 459 + 480 + + + + + 350 + 0 + + + + Form1 + + + + bSup + + + + 310 + 420 + 142 + 30 + + + + &Supprimer + + + Alt+S + + + true + + + suppression du mot clef + + + + + bOk + + + + 160 + 420 + 142 + 30 + + + + &Valider + + + Shift+A, Alt+A, Alt+A, Alt+A + + + true + + + true + + + validation de la saisie + + + + + bHelp + + + + 10 + 420 + 142 + 30 + + + + &Documentation + + + Alt+D + + + true + + + affichage documentation aster + + + + + bAjout + + + + 160 + 260 + 142 + 30 + + + + &Ajouter + + + Alt+A + + + true + + + true + + + validation de la saisie + + + + + textLabel1_2_2 + + + + 180 + 170 + 89 + 33 + + + + <p align="center"><font size="+1">cliquez ci-dessous</font> </p> + + + + + textLabel1 + + + + 160 + 50 + 140 + 36 + + + + <p align="center"><font size="+1">Pour ajouter une autre occurrence</font></p> + + + + + textLabel1_2 + + + + 170 + 80 + 120 + 20 + + + + <p align="center"><font size="+1">du mot clef-facteur</font> </p> + + + + + MCFacteur + + + + 200 + 120 + 50 + 20 + + + + <p align="center">AFFE</p> + + + + + + bOk + clicked() + DMCListAjout + BAjoutClicked() + + + bAjout + clicked() + DMCListAjout + BAjoutClicked() + + + bSup + clicked() + DMCListAjout + BSupPressed() + + + + BAjoutClicked() + BSupPressed() + + + diff --git a/Ui/desMacro.py b/Ui/desMacro.py new file mode 100644 index 00000000..2ec81cd5 --- /dev/null +++ b/Ui/desMacro.py @@ -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("

Mots Clefs Permis

")) + 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("Commandes :")) + 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 index 00000000..a54b2a63 --- /dev/null +++ b/Ui/desMacro.ui @@ -0,0 +1,430 @@ + +DMacro + + + DMacro + + + + 0 + 0 + 521 + 499 + + + + + 505 + 0 + + + + DMacro + + + + Commentaire + + + + 10 + 410 + 490 + 20 + + + + + + + + + bSup + + + + 320 + 440 + 142 + 30 + + + + &Supprimer + + + Alt+S + + + true + + + suppression du mot clef + + + + + bOk + + + + 170 + 440 + 142 + 30 + + + + &Valider + + + Shift+A, Alt+A, Alt+A, Alt+A + + + true + + + true + + + validation de la saisie + + + + + bHelp + + + + 10 + 440 + 142 + 30 + + + + &Documentation + + + Alt+D + + + true + + + affichage documentation aster + + + + + TWChoix + + + + 0 + 0 + 500 + 400 + + + + + MotClef + + + Ajouter Mot-Clef + + + + textLabel1_2 + + + + 360 + 0 + 50 + 37 + + + + <h3><p align="center"><u><b>Régles</b></u></p></h3> + + + + + LBMCPermis + + + + 10 + 40 + 220 + 290 + + + + + 0 + 0 + + + + + + LBRegles + + + + 260 + 40 + 230 + 290 + + + + + + textLabel1 + + + + 50 + 10 + 120 + 20 + + + + + 0 + 0 + + + + <h3><p align="center"><u><b>Mots Clefs Permis</b></u></p></h3> + + + + + + Commande + + + Nouvelle Commande + + + + textLabel6 + + + + 10 + 60 + 60 + 30 + + + + Filtre + + + + + textLabel4 + + + + 90 + 340 + 300 + 30 + + + + La commande choisie sera ajoutée APRES la commande courante + + + + + LBNouvCommande + + + + 50 + 100 + 410 + 240 + + + + + + buttonGroup1 + + + + 300 + 20 + 151 + 70 + + + + Affichage + + + + RBGroupe + + + + 20 + 40 + 101 + 20 + + + + par groupe + + + + + RBalpha + + + + 20 + 20 + 101 + 20 + + + + alphabétique + + + true + + + + + + LEFiltre + + + + 50 + 60 + 160 + 30 + + + + + + textLabel1_4 + + + + 50 + 20 + 171 + 21 + + + + <b><u>Commandes :</u></b> + + + + + BNext + + + + 220 + 60 + 30 + 31 + + + + + + + image0 + + + affiche la prochaine occurence + + + + + + + + 89504e470d0a1a0a0000000d49484452000000210000000e0806000000a11e758c000000cf49444154388dd594db0ec3200c43edfdf8d897bb0f345b480845d51eb64888f412e76001c00f046fd6e99bba77200480924a1032c92efbd8c7d5cabcc025400099e957849568fe7f06c0ded1deb32b4a1ec4ea824b9e74097165bd01f85527f78a7201e0a3129f345a017c543bafdc983d0f7109d15a331b471f47072c17494a82338f6178203a8817e67306b1f08b07ba03e602c9b831077e37e0209e67e3386710977b17de80c185ad38695a51d522c82ce77912e2fed8be83762092f52b1820dd11bb10e565b53a5a3bbaff130713d66fa6981857060000000049454e44ae426082 + + + + + LBNouvCommande + clicked(QListBoxItem*) + DMacro + LBNouvCommandeClicked() + + + LEFiltre + textChanged(const QString&) + DMacro + LEFiltreTextChanged() + + + LEFiltre + returnPressed() + DMacro + LEfiltreReturnPressed() + + + bSup + pressed() + DMacro + BSupPressed() + + + bOk + clicked() + DMacro + BOkPressed() + + + RBalpha + clicked() + DMacro + BuildTabCommand() + + + RBGroupe + clicked() + DMacro + BuildTabCommand() + + + BNext + clicked() + DMacro + BNextPressed() + + + + LBNouvCommandeClicked() + LEFiltreTextChanged() + LEfiltreReturnPressed() + BSupPressed() + BOkPressed() + BuildTabCommand() + BNextPressed() + + + diff --git a/Ui/desPlusieursBase.py b/Ui/desPlusieursBase.py new file mode 100644 index 00000000..b24626fc --- /dev/null +++ b/Ui/desPlusieursBase.py @@ -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("Valeur(s) actuelle(s)")) + self.textLabel1_2.setText(self.__tr("Valeur")) + 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 index 00000000..a54a7d8d --- /dev/null +++ b/Ui/desPlusieursBase.ui @@ -0,0 +1,361 @@ + +DPlusBase + + + DPlusBase + + + + 0 + 0 + 482 + 480 + + + + + 350 + 0 + + + + DUnIn + + + + tabuniqueinto + + + + 20 + 20 + 450 + 440 + + + + + Widget8 + + + Saisir Valeur + + + + bHelp + + + + 0 + 370 + 142 + 30 + + + + &Documentation + + + Alt+D + + + true + + + affichage documentation aster + + + + + bOk + + + + 150 + 370 + 142 + 30 + + + + &Valider + + + Shift+A, Alt+A, Alt+A, Alt+A + + + true + + + true + + + validation de la saisie + + + + + bSup + + + + 300 + 370 + 142 + 30 + + + + &Supprimer + + + Alt+S + + + true + + + suppression du mot clef + + + + + bParam + + + + 290 + 240 + 142 + 30 + + + + &Parametres + + + Alt+P + + + true + + + suppression du mot clef + + + + + bImport + + + + 290 + 280 + 142 + 30 + + + + &Importer + + + Alt+I + + + true + + + suppression du mot clef + + + + + Commentaire + + + + 38 + 337 + 381 + 20 + + + + + + + + + textLabel1 + + + + 40 + 20 + 120 + 21 + + + + <u><font size="+1">Valeur(s) actuelle(s)</font></u> + + + + + textLabel1_2 + + + + 330 + 80 + 45 + 21 + + + + <font size="+1">Valeur</font> + + + + + BAjout1Val + + + + 230 + 120 + 40 + 31 + + + + + + + image0 + + + ajoute la valeur saisie sous l occurence selectionnée (en fin de liste si il n y a pas de selection) + + + + + BSup1Val + + + + 230 + 80 + 40 + 31 + + + + + + + image1 + + + enleve l occurence selectionnee + + + + + LBValeurs + + + + 20 + 50 + 180 + 280 + + + + + + LEValeur + + + + 280 + 110 + 150 + 30 + + + + + + + + + 89504e470d0a1a0a0000000d49484452000000210000000e0806000000a11e758c000000c749444154388dcd94590ec3200c4471d57bc73df9f407d331b159a228aa254448bc3cc68152fec0e4420ceeceb912e08a0239838848f5df02c99c11f86004300119054ae868c56ac206c06b4b109111c802874f3a52a587757123897e4039c46b50d8865b07f5400a450053330893cf8674a30028d492deef04626b559dfe48ac842b1a6daae6850155033b99c5009f70ceda111aab413b6f6a70d118e008e6fd8bc51d5d00a0f614556d1ff9b9be4952aabc3721f8f8b6f624c557ef8947afedf48c5e60b8dfbeb81d6dab9aff99270000000049454e44ae426082 + + + 89504e470d0a1a0a0000000d49484452000000210000000e0806000000a11e758c000000cf49444154388dd594db0ec3200c43edfdf8d897bb0f345b480845d51eb64888f412e76001c00f046fd6e99bba77200480924a1032c92efbd8c7d5cabcc025400099e957849568fe7f06c0ded1deb32b4a1ec4ea824b9e74097165bd01f85527f78a7201e0a3129f345a017c543bafdc983d0f7109d15a331b471f47072c17494a82338f6178203a8817e67306b1f08b07ba03e602c9b831077e37e0209e67e3386710977b17de80c185ad38695a51d522c82ce77912e2fed8be83762092f52b1820dd11bb10e565b53a5a3bbaff130713d66fa6981857060000000049454e44ae426082 + + + + + bHelp + clicked() + DPlusBase + ViewDoc() + + + bOk + clicked() + DPlusBase + BOkPourListePressed() + + + bSup + clicked() + DPlusBase + BSupPressed() + + + bParam + clicked() + DPlusBase + BParametresPressed() + + + bImport + clicked() + DPlusBase + BImportPressed() + + + BAjout1Val + clicked() + DPlusBase + Ajout1Valeur() + + + BSup1Val + clicked() + DPlusBase + Sup1Valeur() + + + LEValeur + returnPressed() + DPlusBase + LEValeurPressed() + + + + BSupPressed() + ViewDoc() + BOkPourListePressed() + BParametresPressed() + LEValeurPressed() + Ajout1Valeur() + Sup1Valeur() + BImportPressed() + + + diff --git a/Ui/desPlusieursInto.py b/Ui/desPlusieursInto.py new file mode 100644 index 00000000..c5c177bb --- /dev/null +++ b/Ui/desPlusieursInto.py @@ -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("Valeur(s) actuelle(s)")) + self.textLabel1_2.setText(self.__tr("Valeur(s) possibles(s)")) + 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 index 00000000..8ea0dcb9 --- /dev/null +++ b/Ui/desPlusieursInto.ui @@ -0,0 +1,296 @@ + +DPlusInto + + + DPlusInto + + + + 0 + 0 + 482 + 480 + + + + + 350 + 0 + + + + DUnIn + + + + tabuniqueinto + + + + 20 + 20 + 450 + 440 + + + + + Widget8 + + + Saisir Valeur + + + + bHelp + + + + 0 + 370 + 142 + 30 + + + + &Documentation + + + Alt+D + + + true + + + affichage documentation aster + + + + + bOk + + + + 150 + 370 + 142 + 30 + + + + &Valider + + + Shift+A, Alt+A, Alt+A, Alt+A + + + true + + + true + + + validation de la saisie + + + + + bSup + + + + 300 + 370 + 142 + 30 + + + + &Supprimer + + + Alt+S + + + true + + + suppression du mot clef + + + + + LBValeurs + + + + 10 + 50 + 180 + 280 + + + + + + BSup1Val + + + + 200 + 70 + 40 + 31 + + + + + + + image0 + + + enleve l occurence selectionnee + + + + + BAjout1Val + + + + 200 + 110 + 40 + 31 + + + + + + + image1 + + + ajoute la valeur saisie sous l occurence selectionnée (en fin de liste si il n y a pas de selection) + + + + + textLabel1 + + + + 40 + 20 + 120 + 21 + + + + <u><font size="+1">Valeur(s) actuelle(s)</font></u> + + + + + textLabel1_2 + + + + 278 + 16 + 130 + 21 + + + + <u><font size="+1">Valeur(s) possibles(s)</font></u> + + + + + Commentaire + + + + 30 + 340 + 381 + 20 + + + + + + + + + listBoxVal + + + + 250 + 50 + 180 + 280 + + + + + + + + + 89504e470d0a1a0a0000000d49484452000000210000000e0806000000a11e758c000000cf49444154388dd594db0ec3200c43edfdf8d897bb0f345b480845d51eb64888f412e76001c00f046fd6e99bba77200480924a1032c92efbd8c7d5cabcc025400099e957849568fe7f06c0ded1deb32b4a1ec4ea824b9e74097165bd01f85527f78a7201e0a3129f345a017c543bafdc983d0f7109d15a331b471f47072c17494a82338f6178203a8817e67306b1f08b07ba03e602c9b831077e37e0209e67e3386710977b17de80c185ad38695a51d522c82ce77912e2fed8be83762092f52b1820dd11bb10e565b53a5a3bbaff130713d66fa6981857060000000049454e44ae426082 + + + 89504e470d0a1a0a0000000d49484452000000210000000e0806000000a11e758c000000c749444154388dcd94590ec3200c4471d57bc73df9f407d331b159a228aa254448bc3cc68152fec0e4420ceeceb912e08a0239838848f5df02c99c11f86004300119054ae868c56ac206c06b4b109111c802874f3a52a587757123897e4039c46b50d8865b07f5400a450053330893cf8674a30028d492deef04626b559dfe48ac842b1a6daae6850155033b99c5009f70ceda111aab413b6f6a70d118e008e6fd8bc51d5d00a0f614556d1ff9b9be4952aabc3721f8f8b6f624c557ef8947afedf48c5e60b8dfbeb81d6dab9aff99270000000049454e44ae426082 + + + + + bHelp + clicked() + DPlusInto + ViewDoc() + + + bOk + clicked() + DPlusInto + BOkPourListePressed() + + + bSup + clicked() + DPlusInto + BSupPressed() + + + LBValeurs + doubleClicked(QListBoxItem*) + DPlusInto + Sup1Valeur() + + + BAjout1Val + clicked() + DPlusInto + Ajout1Valeur() + + + BSup1Val + clicked() + DPlusInto + Sup1Valeur() + + + + BSupPressed() + ViewDoc() + BOkPourListePressed() + Ajout1Valeur() + Sup1Valeur() + + + diff --git a/Ui/desRacine.py b/Ui/desRacine.py new file mode 100644 index 00000000..f82675bb --- /dev/null +++ b/Ui/desRacine.py @@ -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("Commandes :")) + 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 index 00000000..e3c46363 --- /dev/null +++ b/Ui/desRacine.ui @@ -0,0 +1,328 @@ + +DRac + + + DRac + + + + 0 + 0 + 505 + 499 + + + + + 505 + 0 + + + + DMacro + + + + bHelp + + + + 10 + 440 + 142 + 30 + + + + &Documentation + + + Alt+D + + + true + + + affichage documentation aster + + + + + textLabel6 + + + + 10 + 70 + 30 + 30 + + + + Filtre + + + + + textLabel1_4_2 + + + + 350 + 0 + 50 + 21 + + + + <b><u>Régles :</u></b> + + + + + LEFiltre + + + + 50 + 70 + 140 + 30 + + + + + + BNext + + + + 200 + 70 + 30 + 31 + + + + + + + image0 + + + affiche la prochaine occurence + + + + + textLabel1_4 + + + + 90 + 0 + 75 + 21 + + + + <b><u>Commandes :</u></b> + + + + + buttonGroup1 + + + + 10 + 20 + 230 + 40 + + + + Affichage + + + + RBGroupe + + + + 20 + 10 + 101 + 20 + + + + par groupe + + + + + RBalpha + + + + 140 + 10 + 80 + 20 + + + + alphabétique + + + true + + + + + + bOk + + + + 180 + 440 + 142 + 30 + + + + &Valider + + + Shift+A, Alt+A, Alt+A, Alt+A + + + true + + + true + + + validation de la saisie + + + + + bSup + + + + 350 + 440 + 142 + 30 + + + + &Supprimer + + + Alt+S + + + true + + + suppression du mot clef + + + + + LBNouvCommande + + + + 10 + 110 + 230 + 320 + + + + + + LBRegles + + + + 260 + 30 + 230 + 400 + + + + + + + 89504e470d0a1a0a0000000d49484452000000210000000e0806000000a11e758c000000cf49444154388dd594db0ec3200c43edfdf8d897bb0f345b480845d51eb64888f412e76001c00f046fd6e99bba77200480924a1032c92efbd8c7d5cabcc025400099e957849568fe7f06c0ded1deb32b4a1ec4ea824b9e74097165bd01f85527f78a7201e0a3129f345a017c543bafdc983d0f7109d15a331b471f47072c17494a82338f6178203a8817e67306b1f08b07ba03e602c9b831077e37e0209e67e3386710977b17de80c185ad38695a51d522c82ce77912e2fed8be83762092f52b1820dd11bb10e565b53a5a3bbaff130713d66fa6981857060000000049454e44ae426082 + + + + + LBNouvCommande + clicked(QListBoxItem*) + DRac + LBNouvCommandeClicked() + + + LEFiltre + textChanged(const QString&) + DRac + LEFiltreTextChanged() + + + LEFiltre + returnPressed() + DRac + LEfiltreReturnPressed() + + + bSup + pressed() + DRac + BSupPressed() + + + bOk + clicked() + DRac + BOkPressed() + + + RBalpha + clicked() + DRac + BuildTabCommand() + + + RBGroupe + clicked() + DRac + BuildTabCommand() + + + BNext + clicked() + DRac + BNextPressed() + + + + LBNouvCommandeClicked() + LEFiltreTextChanged() + LEfiltreReturnPressed() + BSupPressed() + BOkPressed() + BuildTabCommand() + BNextPressed() + + + diff --git a/Ui/desUniqueASSD.py b/Ui/desUniqueASSD.py new file mode 100644 index 00000000..24b38d77 --- /dev/null +++ b/Ui/desUniqueASSD.py @@ -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 index 00000000..a22cbb9e --- /dev/null +++ b/Ui/desUniqueASSD.ui @@ -0,0 +1,196 @@ + +DUnASSD + + + DUnASSD + + + + 0 + 0 + 482 + 480 + + + + + 350 + 0 + + + + DUnIn + + + + tabuniqueinto + + + + 10 + 20 + 460 + 440 + + + + + Widget8 + + + Saisir Valeur + + + + bSup + + + + 310 + 370 + 142 + 30 + + + + &Supprimer + + + Alt+S + + + true + + + suppression du mot clef + + + + + bOk + + + + 160 + 370 + 142 + 30 + + + + &Valider + + + Shift+A, Alt+A, Alt+A, Alt+A + + + true + + + true + + + validation de la saisie + + + + + bHelp + + + + 10 + 370 + 142 + 30 + + + + &Documentation + + + Alt+D + + + true + + + affichage documentation aster + + + + + textLabel2 + + + + 140 + 20 + 160 + 60 + + + + <font size="+1"><p align="center">Structures de données du type +requis par l'objet courant :</p></font> + + + + + Commentaire + + + + 40 + 311 + 381 + 30 + + + + + + + + + listBoxASSD + + + + 40 + 100 + 380 + 180 + + + + + + + + + bHelp + clicked() + DUnASSD + ViewDoc() + + + bOk + clicked() + DUnASSD + BOkPressed() + + + bSup + clicked() + DUnASSD + BSupPressed() + + + + BSupPressed() + ViewDoc() + BOkPressed() + + + diff --git a/Ui/desUniqueBase.py b/Ui/desUniqueBase.py new file mode 100644 index 00000000..7f69b8ea --- /dev/null +++ b/Ui/desUniqueBase.py @@ -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("

Valeur:

")) + 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 index 00000000..0c47dc40 --- /dev/null +++ b/Ui/desUniqueBase.ui @@ -0,0 +1,219 @@ + +DUnBase + + + DUnBase + + + + 0 + 0 + 482 + 480 + + + + + 350 + 0 + + + + DUnIn + + + + tabuniqueinto + + + + 10 + 20 + 460 + 440 + + + + + Widget8 + + + Saisir Valeur + + + + bSup + + + + 310 + 370 + 142 + 30 + + + + &Supprimer + + + Alt+S + + + true + + + suppression du mot clef + + + + + bOk + + + + 160 + 370 + 142 + 30 + + + + &Valider + + + Shift+A, Alt+A, Alt+A, Alt+A + + + true + + + true + + + validation de la saisie + + + + + bHelp + + + + 10 + 370 + 142 + 30 + + + + &Documentation + + + Alt+D + + + true + + + affichage documentation aster + + + + + Commentaire + + + + 38 + 316 + 381 + 41 + + + + + + + + + textLabel2 + + + + 40 + 160 + 50 + 21 + + + + <b><u><p align="center">Valeur: </p></u></b> + + + + + lineEditVal + + + + 120 + 150 + 231 + 31 + + + + + + bParametres + + + + 300 + 10 + 140 + 30 + + + + Parametres + + + + + + + + bHelp + clicked() + DUnBase + ViewDoc() + + + bOk + clicked() + DUnBase + BOk2Pressed() + + + bSup + clicked() + DUnBase + BSupPressed() + + + lineEditVal + returnPressed() + DUnBase + LEValeurPressed() + + + + BSupPressed() + ViewDoc() + BOk2Pressed() + BParametresPressed() + LEValeurPressed() + + + diff --git a/Ui/desUniqueComp.py b/Ui/desUniqueComp.py new file mode 100644 index 00000000..e0a470df --- /dev/null +++ b/Ui/desUniqueComp.py @@ -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("Complexe de la forme : a+bj")) + self.Commentaire.setText(self.__tr("Un complexe est attendu")) + 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 index 00000000..54af7913 --- /dev/null +++ b/Ui/desUniqueComp.ui @@ -0,0 +1,290 @@ + +DUnComp + + + DUnComp + + + + 0 + 0 + 484 + 480 + + + + + 350 + 0 + + + + DUnComp + + + + tabuniqueinto + + + + 10 + 20 + 460 + 440 + + + + + Widget8 + + + Saisir Valeur + + + + bSup + + + + 310 + 370 + 142 + 30 + + + + &Supprimer + + + Alt+S + + + true + + + suppression du mot clef + + + + + bOk + + + + 160 + 370 + 142 + 30 + + + + &Valider + + + Shift+A, Alt+A, Alt+A, Alt+A + + + true + + + true + + + validation de la saisie + + + + + bHelp + + + + 10 + 370 + 142 + 30 + + + + &Documentation + + + Alt+D + + + true + + + affichage documentation aster + + + + + textLabel1 + + + + 60 + 30 + 190 + 20 + + + + <font size="+2">Complexe de la forme : a+bj</font> + + + + + Commentaire + + + + 140 + 320 + 170 + 30 + + + + <font size="+2">Un complexe est attendu</font> + + + + + LEImag + + + + 240 + 250 + 170 + 31 + + + + + + LEReel + + + + 50 + 250 + 170 + 31 + + + + + + LEcomp + + + + 50 + 60 + 360 + 40 + + + + + + buttonGroup1 + + + + 50 + 160 + 360 + 70 + + + + OU + + + + RBMP + + + + 10 + 40 + 330 + 21 + + + + MP : Module Phase + + + + + RBRI + + + + 10 + 20 + 330 + 21 + + + + RI : Réel Imaginaire + + + + + + + + + bHelp + clicked() + DUnComp + ViewDoc() + + + bOk + clicked() + DUnComp + BOkPressed() + + + bSup + clicked() + DUnComp + BSupPressed() + + + LEImag + returnPressed() + DUnComp + LEImagRPressed() + + + LEReel + returnPressed() + DUnComp + LEReelRPressed() + + + LEcomp + returnPressed() + DUnComp + LEcompRPressed() + + + + BSupPressed() + ViewDoc() + BOkPressed() + LEImagRPressed() + LEReelRPressed() + LEcompRPressed() + + + diff --git a/Ui/desUniqueInto.ui b/Ui/desUniqueInto.ui new file mode 100644 index 00000000..6fa50f00 --- /dev/null +++ b/Ui/desUniqueInto.ui @@ -0,0 +1,211 @@ + +DUnIn + + + DUnIn + + + + 0 + 0 + 482 + 480 + + + + + 350 + 0 + + + + DUnIn + + + + tabuniqueinto + + + + 20 + 20 + 450 + 440 + + + + + Widget8 + + + Saisir Valeur + + + + textLabel2 + + + + 170 + 30 + 100 + 21 + + + + <b><u><p align="center">Valeurs possibles</p></u></b> + + + + + textLabel1 + + + + 170 + -10 + 90 + 31 + + + + <p align="center">Choisir une valeur</p> + + + + + Commentaire + + + + 38 + 316 + 381 + 41 + + + + + + + + + bHelp + + + + 0 + 370 + 142 + 30 + + + + &Documentation + + + Alt+D + + + true + + + affichage documentation aster + + + + + listBoxVal + + + + 80 + 60 + 290 + 240 + + + + + + bOk + + + + 150 + 370 + 142 + 30 + + + + &Valider + + + Shift+A, Alt+A, Alt+A, Alt+A + + + true + + + true + + + validation de la saisie + + + + + bSup + + + + 300 + 370 + 142 + 30 + + + + &Supprimer + + + Alt+S + + + true + + + suppression du mot clef + + + + + + + + bHelp + clicked() + DUnIn + ViewDoc() + + + bOk + clicked() + DUnIn + BOkPressed() + + + bSup + clicked() + DUnIn + BSupPressed() + + + + BSupPressed() + ViewDoc() + BOkPressed() + + + diff --git a/Ui/desUniqueIntoPanel.py b/Ui/desUniqueIntoPanel.py new file mode 100644 index 00000000..b48c58b9 --- /dev/null +++ b/Ui/desUniqueIntoPanel.py @@ -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("

Valeurs possibles

")) + self.textLabel1.setText(self.__tr("

Choisir une valeur

")) + 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 index 00000000..863e7fc3 --- /dev/null +++ b/Ui/myMain.ui @@ -0,0 +1,607 @@ + +Eficas + + + Eficas + + + true + + + + 0 + 0 + 902 + 575 + + + + + 1 + 1 + 0 + 0 + + + + + 21 + 323 + + + + WidgetOrigin + + + + + + + Eficas + + + + line1 + + + + -30 + -10 + 930 + 20 + + + + HLine + + + Sunken + + + Horizontal + + + + + + MenuBar + + + 2 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + toolBar + + + MenuBarPanel + + + false + + + Tools + + + + + + + + + + + + + + + + fileNewAction + + + image0 + + + New + + + &New + + + Ctrl+N + + + + + fileOpenAction + + + image1 + + + Open + + + &Open... + + + Ctrl+O + + + + + fileSaveAction + + + image2 + + + Save + + + &Save + + + Ctrl+S + + + + + fileSaveAsAction + + + Save As + + + Save &As... + + + + + + + + fileExitAction + + + Exit + + + E&xit + + + + + + + + editUndoAction + + + image3 + + + Undo + + + &Undo + + + Ctrl+Z + + + + + editRedoAction + + + image4 + + + Redo + + + &Redo + + + Ctrl+Y + + + + + editCutAction + + + image5 + + + Cut + + + Cu&t + + + Ctrl+X + + + + + editCopyAction + + + image6 + + + Copy + + + &Copy + + + Ctrl+C + + + + + editPasteAction + + + image7 + + + Paste + + + &Paste + + + Ctrl+V + + + + + editFindAction + + + image8 + + + Find + + + &Find... + + + Ctrl+F + + + + + helpContentsAction + + + Contents + + + &Contents... + + + + + + + + helpIndexAction + + + Index + + + &Index... + + + + + + + + helpAboutAction + + + About + + + &About + + + + + + + + traductionnew_itemAction + + + new item + + + new item + + + + + fileSaveCloseAction + + + Close + + + Close + + + + + fileCloseAction + + + Close + + + Close + + + Ctrl+W + + + + + fileNewViewAction + + + New view + + + + + fileCloseAllAction + + + Close All + + + Close All + + + + + jdcRapportDeValidationAction + + + Rapport de validation + + + Rapport de validation + + + Ctrl+R + + + + + jdcFichierSourceAction + + + Fichier source + + + Fichier source + + + Ctrl+B + + + + + + 89504e470d0a1a0a0000000d4948445200000016000000160806000000c4b46c3b0000007449444154388dedd5c109c0200c05d06fe936812c10b2ffdd85d25385b6a991480f053f081af0291210f828c5a9d9c4de96cd2b9ad9eb0000660e2fe0c2519839c4f70c4c446d5e6b3538cf928245e4b2f6f014acaa8fda1d4fc1a5741b22079f9d111d96ea8a912c78c10bee64e60719f57e9203ad452a04cc4e50200000000049454e44ae426082 + + + 89504e470d0a1a0a0000000d4948445200000016000000160806000000c4b46c3b0000009949444154388ded94410e85200c445f89c7367f61bc775d2848a42860ffced9548bbe8e13043e1d928177f481a123dc2b34f6f47a3de2b865a8843f4001982a0b3d5f62c58300aa1ad70550449ab9d507a773a8a4ba4f92a2df333c64c63bebbd82e5b8addecbcc7820eb4266c639745dfa80f36faf66c66fa19c3f882fb470ec05cdc0bed07893f68e171492635f686c3eeff6ba3c8fdd366dc4c0452c8781f8080000000049454e44ae426082 + + + 89504e470d0a1a0a0000000d4948445200000016000000160806000000c4b46c3b000000a049444154388dd5954d0a802010859fd14668e18de662d222bc98376a21b4ac451992c66469e0b7f187f1f11c47052a218e762daddbfb9e99f6568f80b5364b8588ce35440400e80a398ce8f99034d2292cc37c8ebd530feb583a05e954341f8a027b2a7d3a1f09bf854dc5d5d953aa396e4f38cab199e2d2e108abe156f82e30977fcb4d8ff942d75dbebed2e143953a93f6caad3d6111f44b7d4f820ff9c0069bb51ecded318c5c0000000049454e44ae426082 + + + 89504e470d0a1a0a0000000d4948445200000016000000160806000000c4b46c3b0000007349444154388ded92c10e80200840b1ef661d1cff4d876aa888a17669f9360f283ed80060f159425f3a71f53602e08e992b098801d02854176ae47f21ce1fb5b05d38eddc9060d0f11379635b3bc92bd518e239a943ec1d5ab7785cee107be4b215af4091f894de47181ecea59ede9ec59f380062ac28b1e3d701d90000000049454e44ae426082 + + + 89504e470d0a1a0a0000000d4948445200000016000000160806000000c4b46c3b0000007449444154388ded92c10ac02008406ddf2d3b84ffed0ea3586a26d165e0830ea53e8504487e4b910f5489f19ea5a3ca0f8a896365b306c42dd613c649bdc2598316136219f0f936c0a2ef00d75a62614d3ab22996f2a362ffa337c5ebede962aad1a2e84aaaa2f750dd12748c0fd0ab9324677800596e28b1743f46860000000049454e44ae426082 + + + 89504e470d0a1a0a0000000d4948445200000016000000160806000000c4b46c3b0000008249444154388dcdd341128020080550e8e02ebc38ad3273503e48537fe3e48c4f2425fa28e29c6f39920bf9276cb60185358877611388c2576418cda015f520b4e6b55be109dc0622b8e22acf31056e18dfdff80606aa551cc63564c4dcf80cd0201d577a5c85a8845fdc025ea5307afccd07e23a1df283ec2b37d9ad5fb4dfefd49cfbf72fac98c8cc890000000049454e44ae426082 + + + 89504e470d0a1a0a0000000d4948445200000016000000160806000000c4b46c3b000000bf49444154388dd593410a83301045df488ee51dbc8c3ba98bf46a9eabd385350d266362444a3f0c4266fcf3f824f06f12402b66da8c55f3de2212cf9d92cb98c0ba2d7c4544cf9a07638bbad53c4491235ecf7cc1623697a92540c11ff4fda75275015d24a9389e7d6f53df4fe4ccab323eea0f03c0c4b2a0712ce6add89b59b7661c3be095985f261679ee4ebcc22c9788551fe6a2cbc4969a894bcb6f23ee361aab62e252c57294dfbfb610bbf2c897b8a46cc6677eaa519571fa087ea83762da9abacb20235f0000000049454e44ae426082 + + + 89504e470d0a1a0a0000000d4948445200000016000000160806000000c4b46c3b000000d549444154388dc5955d0a84300c8427e2a90a9e6c8b0f4b3dd982d7ca3e58d7fe4cd0ba5d7640024df265da0a057e2439c9eb8d9eaa8841a0c9aad8c82ab32f9c425be1e30e0dcf00c00308f0b3a7a07410a9d7142e00b42c5a5fab696b979b1c837fc0c316b6e4165b64f78d716359919bdc4570de47c04732dd5e5bcc35f0c97762ae787936dccf7513577e79f48c4b27aa0f1327b240f5117fcbe348aa33b6e0224b054d0746b8025e2e3b3e73cde0dd1c97f02e8ed9d0af1db381224bdf33eee698a934a0f617b45540d00bcf4ca08fc0dff406e325c1981bc418760000000049454e44ae426082 + + + 89504e470d0a1a0a0000000d4948445200000016000000160806000000c4b46c3b0000025d49444154388dd593a172db4010863f670a56ecc42278d0653693a0c21c68d6c2e60df21a818111349499c254a8329b55f0e089ddb15ba602b79d6692d699b6d399fee86e67e7db7f77efe07fd3e2c74bd775b3730eef3d5115002382b5166b2d5757578b1729bf02b76d3b0f8703b92d58aed7600400ef1ce3c70306a8aa8aebebeb57c117dfa06ddb525dd754efb600a82a49138a123532ec3ac42b9bcde655ce2ffabe9f87c340fde13dcb4d8daaa24e48ee12c6823808c107969b1a8a9ce3f1f8aa515c38e7c8ada5aa6b00c45f129c67d223938c88e6c860d118b1d592d139baae9bcf83a78965b5465134801b1d2e1f4945c0e350096408ea154490c2e0bd3fef5853c2e486a0019f4d84f58418418362b0408e8b23c924501093314dd359f01b809814112025144015f1964c0bbc1b484b07e4688880c029ebd78e4141f5b434fd76864c053f1e084b0f8580265440634044ce838bbcc03987a61350a3a2285e1d5a4414d0708aa598082162ad3d0fb6d6e287cfa498508d274050447370428c91af8d10fd4481608c390b5e00dcddddcd8e80a9de420248e804840856f03e02907d729465c9ba5ae3468731e6a79fe50260b55a6102c4ee40a6894c33f2cb0cb106512814f8f899b22cb9b9b959b8d1f1f8f848d334b46dfbe29bfe5eadeffbf9783c323a871881ecb4200d1151a8eb9aed76bb00188661eeba8efd7e8f3186ed76cb6ab57ae2fe591b5dd7cdde7b628c8808799e63ada5aaaa67b9bbdd6e6e9a06ef3d755d3f29fec7eafb7ebebdbd9dadb5735996f3fdfdfdfca2e3dfd5c3c3c3dc340dd334b1d96cfe1e184e63dceff7a494fe26f61fe90bbc4c5e59d614caf40000000049454e44ae426082 + + + + + fileNewAction + activated() + Eficas + fileNew() + + + fileOpenAction + activated() + Eficas + fileOpen() + + + fileSaveAction + activated() + Eficas + fileSave() + + + fileSaveAsAction + activated() + Eficas + fileSaveAs() + + + fileExitAction + activated() + Eficas + fileExit() + + + editUndoAction + activated() + Eficas + editUndo() + + + editRedoAction + activated() + Eficas + editRedo() + + + editCutAction + activated() + Eficas + editCut() + + + editPasteAction + activated() + Eficas + editPaste() + + + editFindAction + activated() + Eficas + editFind() + + + helpIndexAction + activated() + Eficas + helpIndex() + + + helpContentsAction + activated() + Eficas + helpContents() + + + helpAboutAction + activated() + Eficas + helpAbout() + + + fileCloseAction + activated() + Eficas + fileClose() + + + fileNewViewAction + activated() + Eficas + fileNewView() + + + fileCloseAllAction + activated() + Eficas + fileCloseAll() + + + editCopyAction + activated() + Eficas + editCopy() + + + jdcRapportDeValidationAction + activated() + Eficas + jdcRapport() + + + jdcFichierSourceAction + activated() + Eficas + jdcFichierSource() + + + + fileNew() + fileOpen() + fileSave() + fileSaveAs() + filePrint() + fileExit() + editUndo() + editRedo() + jdcFichierSource() + fileNewView() + editPaste() + editFind() + helpIndex() + helpContents() + helpAbout() + fileClose() + fileCloseAll() + jdcRapport() + editCut() + editCopy() + + +