]> SALOME platform Git repositories - tools/eficas.git/blob - Editeur/appli.py
Salome HOME
PN
[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 import listeFichiers
47 import listePatrons
48
49 VERSION="EFICAS v1.9"
50
51 class APPLI: 
52   def __init__ (self,master,code=prefs.code,fichier=None,test=0) :
53       self.code=code
54       self.top=master
55       self.top.protocol("WM_DELETE_WINDOW",self.exitEFICAS)
56       self.top.minsize(900,500)
57       self.top.geometry("900x500")
58       self.top.title(VERSION + ' pour '+self.code)
59       self.top.withdraw()
60       self.initializeTk(master)
61       Pmw.initialise(master)
62
63       self.dict_reels={}
64       self.liste_simp_reel=[]
65       # L'attribut test permet d'activer les panneaux de splash et d'erreur (test=0)
66       # Si test est different de 0, les panneaux ne sont pas activés
67       self.test=test
68
69       # Lecture des parametres de configuration (fichier global editeur.ini 
70       # et utilisateur eficas.ini)
71       self.lecture_parametres()
72
73       self.format_fichier = Tkinter.StringVar()
74       self.message=''
75       # Avant la creation du bureau qui lit le catalogue
76       self.version_code=session.d_env.cata
77
78       # Creation de la menubar, toolbar, messagebar
79       self.cree_composants_graphiques()
80       # Creation des autres composants graphiques dont le bureau (parametrable par prefs.py)
81       self.load_appli_composants()              
82       self.listeFichiers=listeFichiers.listeFichiers(self)
83       self.listePatrons=listePatrons.listePatrons(self)
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             pass
249          else:
250             if len(item)==3:
251                raccourci=item[2]
252                raccourci_label="   "+raccourci
253                newitem=(item[0],item[1])
254             else :
255                if len(item)==4:
256                   raccourci=item[2]
257                   raccourci_label="   "+item[3]
258                   newitem=(item[0],item[1])
259                else :
260                   raccourci=""
261                   newitem=item
262             item=newitem
263             label,method=item
264             if type(method) == types.TupleType:
265                # On a un tuple => on cree une cascade
266                menu_cascade=Tkinter.Menu(menu)
267                menu.add_cascade(label=label,menu=menu_cascade)
268                self.cree_menu(menu_cascade,method,appli_composant)
269             elif method[0] == '&':
270                # On a une chaine avec & en tete => on cree un radiobouton
271                command=getattr(appli_composant,method[1:])
272                menu.add_radiobutton(label=label,command=command)
273                if radio == None:radio=number_item
274             else:
275                command=getattr(appli_composant,method)
276                menu.add_command(label=label,accelerator=raccourci_label,command=command)
277                if raccourci != "" :
278                   self.top.bind(raccourci,command)
279       # Si au moins un radiobouton existe on invoke le premier
280       if radio:menu.invoke(radio)
281
282   def fill_menus(self,appli_composant,defs):
283       menudict=self.menubar.menudict
284       for mname,itemlist in defs:
285           menu=menudict.get(mname)
286           if not menu:continue
287           self.cree_menu(menu,itemlist,appli_composant)
288
289   def update_jdc_courant(self):
290       self.bureau.update_jdc_courant()
291
292   def affiche_alerte(self,titre,message):
293       f=Fenetre(self, titre="Compte-rendu d'erreur", texte = titre + "\n\n" + message)
294       f.wait()
295
296