1 # -*- coding: utf-8 -*-
2 # CONFIGURATION MANAGEMENT OF EDF VERSION
3 # ======================================================================
4 # COPYRIGHT (C) 1991 - 2002 EDF R&D WWW.CODE-ASTER.ORG
5 # THIS PROGRAM IS FREE SOFTWARE; YOU CAN REDISTRIBUTE IT AND/OR MODIFY
6 # IT UNDER THE TERMS OF THE GNU GENERAL PUBLIC LICENSE AS PUBLISHED BY
7 # THE FREE SOFTWARE FOUNDATION; EITHER VERSION 2 OF THE LICENSE, OR
8 # (AT YOUR OPTION) ANY LATER VERSION.
10 # THIS PROGRAM IS DISTRIBUTED IN THE HOPE THAT IT WILL BE USEFUL, BUT
11 # WITHOUT ANY WARRANTY; WITHOUT EVEN THE IMPLIED WARRANTY OF
12 # MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. SEE THE GNU
13 # GENERAL PUBLIC LICENSE FOR MORE DETAILS.
15 # YOU SHOULD HAVE RECEIVED A COPY OF THE GNU GENERAL PUBLIC LICENSE
16 # ALONG WITH THIS PROGRAM; IF NOT, WRITE TO EDF R&D CODE_ASTER,
17 # 1 AVENUE DU GENERAL DE GAULLE, 92141 CLAMART CEDEX, FRANCE.
20 # ======================================================================
22 Ce module contient la classe APPLI qui est la classe mère de
23 l'application EFICAS. Elle prend en charge l'organisation générale
24 des composants graphiques et l'initialisation Tk
25 L'aspect applicatif doit etre pris en charge par la classe dérivée
34 from widgets import showerror
40 from styles import style
44 import convert,generator
46 from utils import extension_fichier,stripPath
48 from widgets import Fenetre
49 from Misc import MakeNomComplet
54 VERSION="EFICAS v1.12"
57 def __init__ (self,master,code=prefs.code,fichier=None,test=0) :
60 self.top.protocol("WM_DELETE_WINDOW",self.exitEFICAS)
62 #dimensionnement de la fenetre principale
63 #aspect ratio de l'ecran
64 aspect=float(self.top.winfo_screenwidth())/float(self.top.winfo_screenheight())
65 #resolution (pixels par point). On utilise le fait qu'on a "normalement" 72 points par inch
66 resolution= self.top.winfo_screenwidth()/(self.top.winfo_screenmmwidth()/25.4*72)
67 DDY=max(20,resolution*(fontes.standard[1]+4)) #largeur d'un caractere fonte standard en pixel
68 x=int(45*DDY) #largeur d'ouverture de 45 caracteres de fonte standard
69 y=int(25*DDY) #hauteur d'ouverture de 25 caracteres de fonte standard
70 minx=x*8/10 #largeur min (80 pour cent de largeur)
71 miny=y*8/10 #hauteur min (80 pour cent de hauteur)
72 self.top.minsize(minx,miny)
73 self.top.geometry('%dx%d' % (x,y))
75 self.top.title(VERSION + ' pour '+self.code)
76 self.titre=VERSION + ' pour '+self.code
78 self.initializeTk(master)
79 Pmw.initialise(master)
82 self.liste_simp_reel=[]
83 # L'attribut test permet d'activer les panneaux de splash et d'erreur (test=0)
84 # Si test est different de 0, les panneaux ne sont pas activés
87 # Lecture des parametres de configuration (fichier global editeur.ini
88 # et utilisateur eficas.ini)
89 self.lecture_parametres()
91 self.format_fichier = Tkinter.StringVar()
93 # Avant la creation du bureau qui lit le catalogue
94 self.version_code=session.d_env.cata
96 # Creation de la menubar, toolbar, messagebar
97 self.cree_composants_graphiques()
98 # Creation des autres composants graphiques dont le bureau (parametrable par prefs.py)
99 self.load_appli_composants()
100 self.listeFichiers=listeFichiers.listeFichiers(self)
101 self.listePatrons=listePatrons.listePatrons(self)
104 # Fermer le splash et deiconifier la fenetre principale si on n'est pas en test
109 # Ouverture des fichiers de commandes donnes sur la ligne de commande
112 for study in session.d_env.studies:
114 d=session.get_unit(study,self)
115 self.bureau.openJDC(file=study["comm"],units=d)
118 def send_message(self,message):
121 def exitEFICAS(self):
127 def lecture_parametres(self):
129 Active la lecture des paramètres standards et utilisateur
132 splash._splash.configure(text = "Chargement des paramètres utilisateur")
134 self.CONFIGURATION = configuration.make_config(self,prefs.REPINI)
135 self.CONFIGStyle = configuration.make_config_style(self,prefs.REPINI)
137 def cree_composants_graphiques(self):
139 Cree les constituants graphiques fixes de l'application :
145 splash._splash.configure(text = "Chargement de l'IHM")
146 splash._splash.configure(text = "Chargement de la menubar")
148 self.menubar=menubar.MENUBAR(self,self.top)
150 splash._splash.configure(text = "Chargement de la toolbar")
152 self.toolbar=toolbar.TOOLBAR(self,self.top)
154 splash._splash.configure(text = "Chargement de la statusbar")
156 self.statusbar=statusbar.STATUSBAR(self.top,styles.style.statusfont)
158 def load_appli_composants(self):
160 Cree les autres constituants graphiques de l'application :
164 Cette creation est parametrable par fichier prefs.py
167 splash._splash.configure(text = "Chargement des appli_composants")
168 for mname in self.appli_composants:
169 self.load_appli_composant(mname)
171 def load_appli_composant(self,mname):
172 module=__import__(mname,globals(),locals())
173 factory=getattr(module,mname.upper())
174 appli_composant=factory(self,self.top)
175 setattr(self,mname,appli_composant)
176 self.fill_menus(appli_composant,appli_composant.menu_defs)
177 self.toolbar.creer_boutons_appli_composant(appli_composant.button_defs,appli_composant)
179 def affiche_FAQ(self):
181 faq.affiche(self.top)
183 def affiche_infos(self,message):
184 self.statusbar.affiche_infos(message)
187 def initializeTk(self, root):
189 Initialize platform specific options
191 if sys.platform == 'mac':
192 self.initializeTk_mac(root)
193 elif sys.platform == 'win32':
194 self.initializeTk_win32(root)
196 self.initializeTk_unix(root)
198 def initializeTk_win32(self, root):
199 root.option_add('*Font', fontes.standard)
200 root.option_add('*EntryField.Entry.Font', fontes.standard)
201 root.option_add('*Listbox*Font',fontes.standard)
203 def initializeTk_colors_common(self, root):
204 root.option_add('*background', style.background)
205 root.option_add('*foreground', style.foreground)
206 root.option_add('*EntryField.Entry.background', style.entry_background)
207 root.option_add('*Entry*background', style.entry_background)
208 root.option_add('*Listbox*background', style.list_background)
209 root.option_add('*Listbox*selectBackground', style.list_select_background)
210 root.option_add('*Listbox*selectForeground', style.list_select_foreground)
212 def initializeTk_mac(self, root):
213 self.initializeTk_colors_common(root)
215 def initializeTk_unix(self, root):
216 root.option_add('*Font', fontes.standard)
217 root.option_add('*EntryField.Entry.Font',fontes.standard )
218 root.option_add('*Listbox*Font', fontes.standard)
219 self.initializeTk_colors_common(root)
221 def get_texte_infos(self):
223 Retourne un texte d'informations sur la session courante d'EFICAS
225 texte = VERSION + '\n\n'
226 texte = texte + 'EFICAS est un produit développé par \nEDF-R&D\n'
227 texte = texte + 'Equipe : SINETICS\n\n'
228 texte = texte + 'Code utilisé : %s version %s\n' % (self.code,properties.version)
231 def efface_aide(self,event):
233 Efface la bulle d'aide d'un panneau
241 def affiche_aide(self,event,aide):
243 Affiche l'aide concernant un panneau
248 self.aide=tooltip.TOOLTIP(widget)
249 self.aide.xoffset = 10
250 self.aide.yoffset = - widget.winfo_height()/2
251 self.aide.setText(aide)
255 def cree_menu(self,menu,itemlist,appli_composant):
257 Ajoute les items du tuple itemlist
262 for item in itemlist:
263 number_item=number_item + 1
266 #menu.add_separator()
271 raccourci_label=" "+raccourci
272 newitem=(item[0],item[1])
276 raccourci_label=" "+item[3]
277 newitem=(item[0],item[1])
283 if type(method) == types.TupleType:
284 # On a un tuple => on cree une cascade
285 menu_cascade=Tkinter.Menu(menu)
286 menu.add_cascade(label=label,menu=menu_cascade)
287 self.cree_menu(menu_cascade,method,appli_composant)
288 elif method[0] == '&':
289 # On a une chaine avec & en tete => on cree un radiobouton
290 command=getattr(appli_composant,method[1:])
291 menu.add_radiobutton(label=label,command=command)
292 if radio == None:radio=number_item
294 command=getattr(appli_composant,method)
295 menu.add_command(label=label,accelerator=raccourci_label,command=command)
297 self.top.bind(raccourci,command)
298 # Si au moins un radiobouton existe on invoke le premier
299 if radio:menu.invoke(radio)
301 def fill_menus(self,appli_composant,defs):
302 menudict=self.menubar.menudict
303 for mname,itemlist in defs:
304 menu=menudict.get(mname)
306 self.cree_menu(menu,itemlist,appli_composant)
308 def update_jdc_courant(self):
309 self.bureau.update_jdc_courant()
311 def affiche_alerte(self,titre,message):
312 f=Fenetre(self, titre="Compte-rendu d'erreur", texte = titre + "\n\n" + message)
317 def __init__(self,v=None):
324 class STANDALONE(APPLI):
325 def __init__ (self,code=prefs.code,fichier=None,version='v8.2') :
328 self.format_fichier=valeur()
331 self.liste_simp_reel=[]
332 # L'attribut test doit valoir 1 si on ne veut pas creer les fenetres
334 self.titre="STANDALONE POUR TEST"
336 # Lecture des parametres de configuration (fichier global editeur.ini
337 # et utilisateur eficas.ini)
338 self.lecture_parametres()
341 # Avant la creation du bureau qui lit le catalogue
342 self.version_code=version
344 self.readercata=readercata.READERCATA(self,None)
348 def affiche_infos(self,message):
351 def get_text_JDC(self,JDC,format):
352 if generator.plugins.has_key(format):
353 # Le generateur existe on l'utilise
354 g=generator.plugins[format]()
355 jdc_formate=g.gener(JDC,format='beautifie')
358 # Il n'existe pas c'est une erreur
362 CONTEXT.unset_current_step()
363 J=self.readercata.cata[0].JdC(procedure="",
365 cata=self.readercata.cata,
366 cata_ord_dico=self.readercata.cata_ordonne_dico,
367 rep_mat=self.CONFIGURATION.rep_mat,
372 def openJDC(self,file):
374 e=extension_fichier(file)
375 self.JDCName=stripPath(file)
376 self.initialdir = os.path.dirname(os.path.abspath(file))
377 format=self.format_fichier.get()
378 # Il faut convertir le contenu du fichier en fonction du format
379 if convert.plugins.has_key(format):
380 # Le convertisseur existe on l'utilise
381 p=convert.plugins[format]()
383 text=p.convert('exec',self)
384 if not p.cr.estvide():
385 raise ValueError(str(p.cr))
387 # On se met dans le repertoire ou se trouve le fichier de commandes
388 # pour trouver les eventuels fichiers include ou autres
389 # localises a cote du fichier de commandes
390 os.chdir(self.initialdir)
391 CONTEXT.unset_current_step()
392 J=self.readercata.cata[0].JdC(procedure=text,
394 cata=self.readercata.cata,
395 cata_ord_dico=self.readercata.cata_ordonne_dico,
397 rep_mat=self.CONFIGURATION.rep_mat,
400 txt= J.cr.get_mess_exception()
401 if txt:raise ValueError(txt)
404 def openTXT(self,text):
406 CONTEXT.unset_current_step()
407 J=self.readercata.cata[0].JdC(procedure=text,
409 cata=self.readercata.cata,
410 cata_ord_dico=self.readercata.cata_ordonne_dico,
412 rep_mat=self.CONFIGURATION.rep_mat,
415 txt= J.cr.get_mess_exception()
416 if txt:raise ValueError(txt)
419 def create_item(self,obj):
420 return comploader.make_objecttreeitem(self,getattr(obj,"nom","item"),obj)
422 def get_file(self,unite=None,fic_origine = ''):
424 Retourne le nom du fichier correspondant a l unite logique unite (entier)
425 ou d'un fichier poursuite
427 f,ext=os.path.splitext(fic_origine)
430 finclude=f+".%d" % unite
437 ext=".com%d" % (string.atoi(n)-1)
438 if ext == '.com0' and not os.path.isfile(f+".com0"):
446 def affiche_alerte(self,titre,message):
447 print titre+ "\n\n" + message