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