Salome HOME
CCAR: corrections diverses dans le cas d'insertion d'un include avec concepts de
[tools/eficas.git] / Editeur / appli.py
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.
9 #
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.
14 #
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.
18 #
19 #
20 # ======================================================================
21 """
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
26 """
27 # Modules Python
28 import os
29 import sys
30 import types
31 import Pmw
32 import Tkinter
33 from widgets import showerror
34
35 # Modules Eficas
36 import splash
37 import prefs
38 import styles
39 from styles import style
40 import fontes
41 import tooltip
42 import properties
43 from widgets import Fenetre
44 from Misc import MakeNomComplet
45 import session
46
47 VERSION="EFICAS v1.8"
48
49 class APPLI: 
50   def __init__ (self,master,code=prefs.code,fichier=None,test=0) :
51       self.code=code
52       self.top=master
53       self.top.protocol("WM_DELETE_WINDOW",self.exitEFICAS)
54       self.top.minsize(900,500)
55       self.top.geometry("900x500")
56       self.top.title(VERSION + ' pour '+self.code)
57       self.top.withdraw()
58       self.initializeTk(master)
59       Pmw.initialise(master)
60
61       self.dict_reels={}
62       self.liste_simp_reel=[]
63       # L'attribut test permet d'activer les panneaux de splash et d'erreur (test=0)
64       # Si test est different de 0, les panneaux ne sont pas activés
65       self.test=test
66
67       # Lecture des parametres de configuration (fichier global editeur.ini 
68       # et utilisateur eficas.ini)
69       self.lecture_parametres()
70
71       self.format_fichier = Tkinter.StringVar()
72       self.message=''
73       # Avant la creation du bureau qui lit le catalogue
74       self.version_code=session.d_env.cata
75
76       # Creation de la menubar, toolbar, messagebar
77       self.cree_composants_graphiques()
78       # Creation des autres composants graphiques dont le bureau (parametrable par prefs.py)
79       self.load_appli_composants()              
80
81       # PN : ajout d un attribut pour indiquer si 
82       # l appli a ete lance depuis Salome
83       self.salome=0
84
85       # Fermer le splash et deiconifier la fenetre principale si on n'est pas en test
86       if (self.test == 0):
87            splash.fini_splash()
88            #self.affiche_FAQ()
89
90       # Ouverture des fichiers de commandes donnes sur la ligne de commande
91       cwd=os.getcwd()
92       for study in session.d_env.studies:
93           os.chdir(cwd)
94           d=session.get_unit(study,self)
95           self.bureau.openJDC(study["comm"],d)
96
97
98   def send_message(self,message):
99       self.message=message
100
101   def exitEFICAS(self):
102       self.quit()
103
104   def quit(self):
105       self.top.quit()
106
107   def lecture_parametres(self):
108       """
109           Active la lecture des paramètres standards et utilisateur
110       """
111       if (self.test == 0):
112          splash._splash.configure(text = "Chargement des paramètres utilisateur")
113       import configuration
114       self.CONFIGURATION = configuration.make_config(self,prefs.REPINI)
115
116   def cree_composants_graphiques(self):
117       """
118           Cree les constituants graphiques fixes de l'application :
119            - menubar
120            - toolbar
121            - statusbar
122       """
123       if (self.test == 0):
124          splash._splash.configure(text = "Chargement de l'IHM")
125          splash._splash.configure(text = "Chargement de la menubar")
126       import menubar
127       self.menubar=menubar.MENUBAR(self,self.top)
128       if (self.test == 0):
129          splash._splash.configure(text = "Chargement de la toolbar")
130       import toolbar
131       self.toolbar=toolbar.TOOLBAR(self,self.top)
132       if (self.test == 0):
133          splash._splash.configure(text = "Chargement de la statusbar")
134       import statusbar
135       self.statusbar=statusbar.STATUSBAR(self.top)
136
137   def load_appli_composants(self):
138       """
139           Cree les autres constituants graphiques de l'application :
140            - bureau 
141            - readercata
142            - ...
143           Cette creation est parametrable par fichier prefs.py
144       """
145       if (self.test == 0):
146          splash._splash.configure(text = "Chargement des appli_composants")
147       for mname in self.appli_composants:
148          self.load_appli_composant(mname)
149
150   def load_appli_composant(self,mname):
151       module=__import__(mname,globals(),locals())
152       factory=getattr(module,mname.upper())
153       appli_composant=factory(self,self.top)
154       setattr(self,mname,appli_composant)
155       self.fill_menus(appli_composant,appli_composant.menu_defs)
156       self.toolbar.creer_boutons_appli_composant(appli_composant.button_defs,appli_composant)
157
158   def affiche_FAQ(self):
159       import faq
160       faq.affiche(self.top)
161
162   def affiche_infos(self,message):
163       self.statusbar.affiche_infos(message)
164       return
165
166   def  initializeTk(self, root):
167         """
168         Initialize platform specific options
169         """
170         if sys.platform == 'mac':
171             self.initializeTk_mac(root)
172         elif sys.platform == 'win32':
173             self.initializeTk_win32(root)
174         else:
175             self.initializeTk_unix(root)
176
177   def initializeTk_win32(self, root):
178         root.option_add('*Font', fontes.standard)
179         root.option_add('*EntryField.Entry.Font', fontes.standard)
180         root.option_add('*Listbox*Font',fontes.standard)
181
182   def initializeTk_colors_common(self, root):
183         root.option_add('*background', style.background)
184         root.option_add('*foreground', style.foreground)
185         root.option_add('*EntryField.Entry.background', style.entry_background)
186         root.option_add('*Entry*background', style.entry_background)
187         root.option_add('*Listbox*background', style.list_background)
188         root.option_add('*Listbox*selectBackground', style.list_select_background)
189         root.option_add('*Listbox*selectForeground', style.list_select_foreground)
190
191   def initializeTk_mac(self, root):
192         self.initializeTk_colors_common(root)
193
194   def initializeTk_unix(self, root):
195       root.option_add('*Font', fontes.standard)
196       root.option_add('*EntryField.Entry.Font',fontes.standard )
197       root.option_add('*Listbox*Font', fontes.standard)
198       self.initializeTk_colors_common(root)
199
200   def get_texte_infos(self):
201       """
202           Retourne un texte d'informations sur la session courante d'EFICAS
203       """
204       texte = VERSION + '\n\n'
205       texte = texte + 'EFICAS est un produit développé par \nEDF-R&D\n'
206       texte = texte + 'Equipe : SINETICS\n\n'
207       texte = texte + 'Code utilisé : %s version %s\n' % (self.code,properties.version)
208       return texte
209
210   def efface_aide(self,event):
211       """
212           Efface la bulle d'aide d'un panneau
213       """
214       try:
215           self.aide.destroy()
216       except:
217           pass
218       return
219
220   def affiche_aide(self,event,aide):
221       """
222           Affiche l'aide concernant un panneau
223       """
224       x=event.x
225       y=event.y
226       widget=event.widget
227       self.aide=tooltip.TOOLTIP(widget)
228       self.aide.xoffset = 10
229       self.aide.yoffset = - widget.winfo_height()/2
230       self.aide.setText(aide)
231       self.aide._showTip()
232       return 
233
234   def cree_menu(self,menu,itemlist,appli_composant):
235       """
236           Ajoute les items du tuple itemlist
237           dans le menu menu
238       """
239       number_item=0
240       radio=None
241       for item in itemlist:
242          number_item=number_item + 1
243          if not item :
244             menu.add_separator()
245          else:
246             if len(item)==3:
247                raccourci=item[2]
248                newitem=(item[0],item[1])
249             else :
250                raccourci=""
251                newitem=item
252             item=newitem
253             label,method=item
254             if type(method) == types.TupleType:
255                # On a un tuple => on cree une cascade
256                menu_cascade=Tkinter.Menu(menu)
257                menu.add_cascade(label=label,menu=menu_cascade)
258                self.cree_menu(menu_cascade,method,appli_composant)
259             elif method[0] == '&':
260                # On a une chaine avec & en tete => on cree un radiobouton
261                command=getattr(appli_composant,method[1:])
262                menu.add_radiobutton(label=label,command=command)
263                if radio == None:radio=number_item
264             else:
265                command=getattr(appli_composant,method)
266                menu.add_command(label=label,command=command)
267                if raccourci != "" :
268                   self.top.bind(raccourci,command)
269       # Si au moins un radiobouton existe on invoke le premier
270       if radio:menu.invoke(radio)
271
272   def fill_menus(self,appli_composant,defs):
273       menudict=self.menubar.menudict
274       for mname,itemlist in defs:
275           menu=menudict.get(mname)
276           if not menu:continue
277           self.cree_menu(menu,itemlist,appli_composant)
278
279   def update_jdc_courant(self):
280       self.bureau.update_jdc_courant()
281
282   def affiche_alerte(self,titre,message):
283       f=Fenetre(self, titre="Compte-rendu d'erreur", texte = titre + "\n\n" + message)
284       f.wait()
285
286