Salome HOME
PN : pour visualisation des geométries + correction de bug
[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       self.dir=None
85
86       # Fermer le splash et deiconifier la fenetre principale si on n'est pas en test
87       if (self.test == 0):
88            splash.fini_splash()
89            #self.affiche_FAQ()
90
91       # Ouverture des fichiers de commandes donnes sur la ligne de commande
92       cwd=os.getcwd()
93       self.dir=cwd
94       for study in session.d_env.studies:
95           os.chdir(cwd)
96           d=session.get_unit(study,self)
97           self.bureau.openJDC(file=study["comm"],units=d)
98
99
100   def send_message(self,message):
101       self.message=message
102
103   def exitEFICAS(self):
104       self.quit()
105
106   def quit(self):
107       self.top.quit()
108
109   def lecture_parametres(self):
110       """
111           Active la lecture des paramètres standards et utilisateur
112       """
113       if (self.test == 0):
114          splash._splash.configure(text = "Chargement des paramètres utilisateur")
115       import configuration
116       self.CONFIGURATION = configuration.make_config(self,prefs.REPINI)
117
118   def cree_composants_graphiques(self):
119       """
120           Cree les constituants graphiques fixes de l'application :
121            - menubar
122            - toolbar
123            - statusbar
124       """
125       if (self.test == 0):
126          splash._splash.configure(text = "Chargement de l'IHM")
127          splash._splash.configure(text = "Chargement de la menubar")
128       import menubar
129       self.menubar=menubar.MENUBAR(self,self.top)
130       if (self.test == 0):
131          splash._splash.configure(text = "Chargement de la toolbar")
132       import toolbar
133       self.toolbar=toolbar.TOOLBAR(self,self.top)
134       if (self.test == 0):
135          splash._splash.configure(text = "Chargement de la statusbar")
136       import statusbar
137       self.statusbar=statusbar.STATUSBAR(self.top)
138
139   def load_appli_composants(self):
140       """
141           Cree les autres constituants graphiques de l'application :
142            - bureau 
143            - readercata
144            - ...
145           Cette creation est parametrable par fichier prefs.py
146       """
147       if (self.test == 0):
148          splash._splash.configure(text = "Chargement des appli_composants")
149       for mname in self.appli_composants:
150          self.load_appli_composant(mname)
151
152   def load_appli_composant(self,mname):
153       module=__import__(mname,globals(),locals())
154       factory=getattr(module,mname.upper())
155       appli_composant=factory(self,self.top)
156       setattr(self,mname,appli_composant)
157       self.fill_menus(appli_composant,appli_composant.menu_defs)
158       self.toolbar.creer_boutons_appli_composant(appli_composant.button_defs,appli_composant)
159
160   def affiche_FAQ(self):
161       import faq
162       faq.affiche(self.top)
163
164   def affiche_infos(self,message):
165       self.statusbar.affiche_infos(message)
166       return
167
168   def  initializeTk(self, root):
169         """
170         Initialize platform specific options
171         """
172         if sys.platform == 'mac':
173             self.initializeTk_mac(root)
174         elif sys.platform == 'win32':
175             self.initializeTk_win32(root)
176         else:
177             self.initializeTk_unix(root)
178
179   def initializeTk_win32(self, root):
180         root.option_add('*Font', fontes.standard)
181         root.option_add('*EntryField.Entry.Font', fontes.standard)
182         root.option_add('*Listbox*Font',fontes.standard)
183
184   def initializeTk_colors_common(self, root):
185         root.option_add('*background', style.background)
186         root.option_add('*foreground', style.foreground)
187         root.option_add('*EntryField.Entry.background', style.entry_background)
188         root.option_add('*Entry*background', style.entry_background)
189         root.option_add('*Listbox*background', style.list_background)
190         root.option_add('*Listbox*selectBackground', style.list_select_background)
191         root.option_add('*Listbox*selectForeground', style.list_select_foreground)
192
193   def initializeTk_mac(self, root):
194         self.initializeTk_colors_common(root)
195
196   def initializeTk_unix(self, root):
197       root.option_add('*Font', fontes.standard)
198       root.option_add('*EntryField.Entry.Font',fontes.standard )
199       root.option_add('*Listbox*Font', fontes.standard)
200       self.initializeTk_colors_common(root)
201
202   def get_texte_infos(self):
203       """
204           Retourne un texte d'informations sur la session courante d'EFICAS
205       """
206       texte = VERSION + '\n\n'
207       texte = texte + 'EFICAS est un produit développé par \nEDF-R&D\n'
208       texte = texte + 'Equipe : SINETICS\n\n'
209       texte = texte + 'Code utilisé : %s version %s\n' % (self.code,properties.version)
210       return texte
211
212   def efface_aide(self,event):
213       """
214           Efface la bulle d'aide d'un panneau
215       """
216       try:
217           self.aide.destroy()
218       except:
219           pass
220       return
221
222   def affiche_aide(self,event,aide):
223       """
224           Affiche l'aide concernant un panneau
225       """
226       x=event.x
227       y=event.y
228       widget=event.widget
229       self.aide=tooltip.TOOLTIP(widget)
230       self.aide.xoffset = 10
231       self.aide.yoffset = - widget.winfo_height()/2
232       self.aide.setText(aide)
233       self.aide._showTip()
234       return 
235
236   def cree_menu(self,menu,itemlist,appli_composant):
237       """
238           Ajoute les items du tuple itemlist
239           dans le menu menu
240       """
241       number_item=0
242       radio=None
243       for item in itemlist:
244          number_item=number_item + 1
245          raccourci_label=""
246          if not item :
247             menu.add_separator()
248          else:
249             if len(item)==3:
250                raccourci=item[2]
251                raccourci_label="   "+raccourci
252                newitem=(item[0],item[1])
253             else :
254                if len(item)==4:
255                   raccourci=item[2]
256                   raccourci_label="   "+item[3]
257                   newitem=(item[0],item[1])
258                else :
259                   raccourci=""
260                   newitem=item
261             item=newitem
262             label,method=item
263             if type(method) == types.TupleType:
264                # On a un tuple => on cree une cascade
265                menu_cascade=Tkinter.Menu(menu)
266                menu.add_cascade(label=label,menu=menu_cascade)
267                self.cree_menu(menu_cascade,method,appli_composant)
268             elif method[0] == '&':
269                # On a une chaine avec & en tete => on cree un radiobouton
270                command=getattr(appli_composant,method[1:])
271                menu.add_radiobutton(label=label,command=command)
272                if radio == None:radio=number_item
273             else:
274                command=getattr(appli_composant,method)
275                menu.add_command(label=label,accelerator=raccourci_label,command=command)
276                if raccourci != "" :
277                   self.top.bind(raccourci,command)
278       # Si au moins un radiobouton existe on invoke le premier
279       if radio:menu.invoke(radio)
280
281   def fill_menus(self,appli_composant,defs):
282       menudict=self.menubar.menudict
283       for mname,itemlist in defs:
284           menu=menudict.get(mname)
285           if not menu:continue
286           self.cree_menu(menu,itemlist,appli_composant)
287
288   def update_jdc_courant(self):
289       self.bureau.update_jdc_courant()
290
291   def affiche_alerte(self,titre,message):
292       f=Fenetre(self, titre="Compte-rendu d'erreur", texte = titre + "\n\n" + message)
293       f.wait()
294
295