Salome HOME
PN : pour les clefs documentaires
[tools/eficas.git] / Editeur / appli.py
1 #            CONFIGURATION MANAGEMENT OF EDF VERSION
2 # ======================================================================
3 # COPYRIGHT (C) 1991 - 2002  EDF R&D                  WWW.CODE-ASTER.ORG
4 # THIS PROGRAM IS FREE SOFTWARE; YOU CAN REDISTRIBUTE IT AND/OR MODIFY
5 # IT UNDER THE TERMS OF THE GNU GENERAL PUBLIC LICENSE AS PUBLISHED BY
6 # THE FREE SOFTWARE FOUNDATION; EITHER VERSION 2 OF THE LICENSE, OR
7 # (AT YOUR OPTION) ANY LATER VERSION.
8 #
9 # THIS PROGRAM IS DISTRIBUTED IN THE HOPE THAT IT WILL BE USEFUL, BUT
10 # WITHOUT ANY WARRANTY; WITHOUT EVEN THE IMPLIED WARRANTY OF
11 # MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. SEE THE GNU
12 # GENERAL PUBLIC LICENSE FOR MORE DETAILS.
13 #
14 # YOU SHOULD HAVE RECEIVED A COPY OF THE GNU GENERAL PUBLIC LICENSE
15 # ALONG WITH THIS PROGRAM; IF NOT, WRITE TO EDF R&D CODE_ASTER,
16 #    1 AVENUE DU GENERAL DE GAULLE, 92141 CLAMART CEDEX, FRANCE.
17 #
18 #
19 # ======================================================================
20 """
21     Ce module contient la classe APPLI qui est la classe mère de
22     l'application EFICAS. Elle prend en charge l'organisation générale
23     des composants graphiques et l'initialisation Tk
24     L'aspect applicatif doit etre pris en charge par la classe dérivée
25 """
26 # Modules Python
27 import os
28 import sys
29 import types
30 import Pmw
31 import Tkinter
32 from widgets import showerror
33
34 # Modules Eficas
35 import splash
36 import prefs
37 import fontes
38 import tooltip
39 import properties
40 from widgets import Fenetre
41 from Misc import MakeNomComplet
42
43 VERSION="EFICAS v1.6"
44
45 class APPLI: 
46   def __init__ (self,master,code='ASTER',fichier=None) :
47       self.top=master
48       self.code=code
49       self.top.protocol("WM_DELETE_WINDOW",self.exitEFICAS)
50       self.top.minsize(900,500)
51       self.top.geometry("900x500")
52       self.top.title(VERSION + ' pour '+self.code)
53       self.top.withdraw()
54       self.initializeTk(master)
55       Pmw.initialise(master)
56       self.lecture_parametres()
57       self.format_fichier = Tkinter.StringVar()
58       self.message=''
59       self.cree_composants_graphiques()
60       self.load_appli_composants()                      # Creation du BUREAU
61       splash.fini_splash()
62       self.affiche_FAQ()
63       # AY : cas ou le nom du fichier a été passé en argument
64       if fichier :
65            fich=str(MakeNomComplet.FILENAME(fichier))
66            if not os.path.isfile(fich):
67               showerror("Fichier inexistant", "Fichier %s en argument n'existe pas" % fich)
68            else:
69               self.bureau.openJDC( fich)
70       # AY : fin
71       # PN : ajout d un attribut pour indiquer si 
72       # l appli a ete lance depuis Salome
73       self.salome=0
74
75   def send_message(self,message):
76       self.message=message
77
78   def exitEFICAS(self):
79       self.quit()
80
81   def quit(self):
82       self.top.quit()
83
84   def lecture_parametres(self):
85       """
86           Active la lecture des paramètres standards et utilisateur
87       """
88       splash._splash.configure(text = "Chargement des paramètres utilisateur")
89       import configuration
90       self.CONFIGURATION = configuration.make_config(self,prefs.REPINI)
91
92   def cree_composants_graphiques(self):
93       """
94           Cree les constituants de l'application :
95            - menubar
96            - toolbar
97            - bureau
98            - statusbar
99       """
100       splash._splash.configure(text = "Chargement de l'IHM")
101       splash._splash.configure(text = "Chargement de la menubar")
102       import menubar
103       self.menubar=menubar.MENUBAR(self,self.top)
104       splash._splash.configure(text = "Chargement de la toolbar")
105       import toolbar
106       self.toolbar=toolbar.TOOLBAR(self,self.top)
107       splash._splash.configure(text = "Chargement de la statusbar")
108       import statusbar
109       self.statusbar=statusbar.STATUSBAR(self.top)
110
111   def load_appli_composants(self):
112       splash._splash.configure(text = "Chargement des appli_composants")
113       for mname in self.appli_composants:
114          self.load_appli_composant(mname)
115
116   def load_appli_composant(self,mname):
117       module=__import__(mname,globals(),locals())
118       factory=getattr(module,mname.upper())
119       appli_composant=factory(self,self.top)
120       setattr(self,mname,appli_composant)
121       self.fill_menus(appli_composant,appli_composant.menu_defs)
122       self.toolbar.creer_boutons_appli_composant(appli_composant.button_defs,appli_composant)
123
124   def affiche_FAQ(self):
125       import faq
126       faq.affiche(self.top)
127
128   def affiche_infos(self,message):
129       self.statusbar.affiche_infos(message)
130       return
131
132   def  initializeTk(self, root):
133         """
134         Initialize platform specific options
135         """
136         if sys.platform == 'mac':
137             self.initializeTk_mac(root)
138         elif sys.platform == 'win32':
139             self.initializeTk_win32(root)
140         else:
141             self.initializeTk_unix(root)
142
143   def initializeTk_win32(self, root):
144         root.option_add('*Font', fontes.standard)
145         root.option_add('*EntryField.Entry.Font', fontes.standard)
146         root.option_add('*Listbox*Font',fontes.standard)
147
148   def initializeTk_colors_common(self, root):
149         root.option_add('*background', 'grey')
150         root.option_add('*foreground', 'black')
151         root.option_add('*EntryField.Entry.background', 'white')
152         root.option_add('*Entry*background', 'white')
153         root.option_add('*Listbox*background', 'white')
154         root.option_add('*Listbox*selectBackground', '#00008b')
155         root.option_add('*Listbox*selectForeground', 'white')
156
157   def initializeTk_mac(self, root):
158         self.initializeTk_colors_common(root)
159
160   def initializeTk_unix(self, root):
161       root.option_add('*Font', fontes.standard)
162       root.option_add('*EntryField.Entry.Font',fontes.standard )
163       root.option_add('*Listbox*Font', fontes.standard)
164       self.initializeTk_colors_common(root)
165
166   def get_texte_infos(self):
167       """
168           Retourne un texte d'informations sur la session courante d'EFICAS
169       """
170       texte = VERSION + '\n\n'
171       texte = texte + 'EFICAS est un produit développé par \nEDF-R&D\n'
172       texte = texte + 'Equipe : SINETICS\n\n'
173       texte = texte + 'Code utilisé : %s version %s\n' % (self.code,properties.version)
174       return texte
175
176   def efface_aide(self,event):
177       """
178           Efface la bulle d'aide d'un panneau
179       """
180       try:
181           self.aide.destroy()
182       except:
183           pass
184       return
185
186   def affiche_aide(self,event,aide):
187       """
188           Affiche l'aide concernant un panneau
189       """
190       x=event.x
191       y=event.y
192       widget=event.widget
193       self.aide=tooltip.TOOLTIP(widget)
194       self.aide.xoffset = 10
195       self.aide.yoffset = - widget.winfo_height()/2
196       self.aide.setText(aide)
197       self.aide._showTip()
198       return 
199
200   def cree_menu(self,menu,itemlist,appli_composant):
201       """
202           Ajoute les items du tuple itemlist
203           dans le menu menu
204       """
205       number_item=0
206       radio=None
207       for item in itemlist:
208          number_item=number_item + 1
209          if not item :
210             menu.add_separator()
211          else:
212             label,method=item
213             if type(method) == types.TupleType:
214                # On a un tuple => on cree une cascade
215                menu_cascade=Tkinter.Menu(menu)
216                menu.add_cascade(label=label,menu=menu_cascade)
217                self.cree_menu(menu_cascade,method,appli_composant)
218             elif method[0] == '&':
219                # On a une chaine avec & en tete => on cree un radiobouton
220                command=getattr(appli_composant,method[1:])
221                menu.add_radiobutton(label=label,command=command)
222                if radio == None:radio=number_item
223             else:
224                command=getattr(appli_composant,method)
225                menu.add_command(label=label,command=command)
226       # Si au moins un radiobouton existe on invoke le premier
227       if radio:menu.invoke(radio)
228
229   def fill_menus(self,appli_composant,defs):
230       menudict=self.menubar.menudict
231       for mname,itemlist in defs:
232           menu=menudict.get(mname)
233           if not menu:continue
234           self.cree_menu(menu,itemlist,appli_composant)
235
236   def update_jdc_courant(self):
237       self.bureau.update_jdc_courant()
238
239   def affiche_alerte(self,titre,message):
240       f=Fenetre(self, titre="Compte-rendu d'erreur", texte = titre + "\n\n" + message)
241       f.wait()
242
243