Salome HOME
mise a jour proc distrib
[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 sys
28 import types
29 import Pmw
30 import Tkinter
31
32 # Modules Eficas
33 import splash
34 import prefs
35 import fontes
36 import tooltip
37 import properties
38
39 VERSION="EFICAS v1.3"
40
41 class APPLI: 
42   def __init__ (self,master,code='ASTER',fichier=None) :
43       self.top=master
44       self.code=code
45       self.top.protocol("WM_DELETE_WINDOW",self.exitEFICAS)
46       self.top.minsize(900,500)
47       self.top.geometry("900x500")
48       self.top.title(VERSION + ' pour '+self.code)
49       self.top.withdraw()
50       self.initializeTk(master)
51       Pmw.initialise(master)
52       self.lecture_parametres()
53       self.format_fichier = Tkinter.StringVar()
54       self.message=''
55       self.cree_composants_graphiques()
56       self.load_appli_composants()
57       self.affiche_FAQ()
58       splash.fini_splash()
59
60   def send_message(self,message):
61       self.message=message
62
63   def exitEFICAS(self):
64       self.quit()
65
66   def quit(self):
67       self.top.quit()
68
69   def lecture_parametres(self):
70       """
71           Active la lecture des paramètres standards et utilisateur
72       """
73       splash._splash.configure(text = "Chargement des paramètres utilisateur")
74       import configuration
75       self.CONFIGURATION = configuration.make_config(self,prefs.REPINI)
76
77   def cree_composants_graphiques(self):
78       """
79           Cree les constituants de l'application :
80            - menubar
81            - tollbar
82            - bureau
83            - statusbar
84       """
85       splash._splash.configure(text = "Chargement de l'IHM")
86       splash._splash.configure(text = "Chargement de la menubar")
87       import menubar
88       self.menubar=menubar.MENUBAR(self,self.top)
89       splash._splash.configure(text = "Chargement de la toolbar")
90       import toolbar
91       self.toolbar=toolbar.TOOLBAR(self,self.top)
92       splash._splash.configure(text = "Chargement de la statusbar")
93       import statusbar
94       self.statusbar=statusbar.STATUSBAR(self.top)
95
96   def load_appli_composants(self):
97       splash._splash.configure(text = "Chargement des appli_composants")
98       for mname in self.appli_composants:
99          self.load_appli_composant(mname)
100
101   def load_appli_composant(self,mname):
102       module=__import__(mname,globals(),locals())
103       factory=getattr(module,mname.upper())
104       appli_composant=factory(self,self.top)
105       setattr(self,mname,appli_composant)
106       self.fill_menus(appli_composant,appli_composant.menu_defs)
107       self.toolbar.creer_boutons_appli_composant(appli_composant.button_defs,appli_composant)
108
109   def affiche_FAQ(self):
110       import faq
111       faq.affiche(self.top)
112
113   def affiche_infos(self,message):
114       self.statusbar.affiche_infos(message)
115       return
116
117   def  initializeTk(self, root):
118         """
119         Initialize platform specific options
120         """
121         if sys.platform == 'mac':
122             self.initializeTk_mac(root)
123         elif sys.platform == 'win32':
124             self.initializeTk_win32(root)
125         else:
126             self.initializeTk_unix(root)
127
128   def initializeTk_win32(self, root):
129         root.option_add('*Font', fontes.standard)
130         root.option_add('*EntryField.Entry.Font', fontes.standard)
131         root.option_add('*Listbox*Font',fontes.standard)
132
133   def initializeTk_colors_common(self, root):
134         root.option_add('*background', 'grey')
135         root.option_add('*foreground', 'black')
136         root.option_add('*EntryField.Entry.background', 'white')
137         root.option_add('*Entry*background', 'white')
138         root.option_add('*Listbox*background', 'white')
139         root.option_add('*Listbox*selectBackground', '#00008b')
140         root.option_add('*Listbox*selectForeground', 'white')
141
142   def initializeTk_mac(self, root):
143         self.initializeTk_colors_common(root)
144
145   def initializeTk_unix(self, root):
146       root.option_add('*Font', fontes.standard)
147       root.option_add('*EntryField.Entry.Font',fontes.standard )
148       root.option_add('*Listbox*Font', fontes.standard)
149       self.initializeTk_colors_common(root)
150
151   def get_texte_infos(self):
152       """
153           Retourne un texte d'informations sur la session courante d'EFICAS
154       """
155       texte = VERSION + '\n\n'
156       texte = texte + 'EFICAS est un produit développé par \nEDF-Division Stratégie et Développement\n'
157       texte = texte + 'Equipe : MTI/MMN\n\n'
158       texte = texte + 'Code utilisé : %s version %s\n' % (self.code,properties.version)
159       return texte
160
161   def efface_aide(self,event):
162       """
163           Efface la bulle d'aide d'un panneau
164       """
165       try:
166           self.aide.destroy()
167       except:
168           pass
169       return
170
171   def affiche_aide(self,event,aide):
172       """
173           Affiche l'aide concernant un panneau
174       """
175       x=event.x
176       y=event.y
177       widget=event.widget
178       self.aide=tooltip.TOOLTIP(widget)
179       self.aide.xoffset = 10
180       self.aide.yoffset = - widget.winfo_height()/2
181       self.aide.setText(aide)
182       self.aide._showTip()
183       return 
184
185   def cree_menu(self,menu,itemlist,appli_composant):
186       """
187           Ajoute les items du tuple itemlist
188           dans le menu menu
189       """
190       number_item=0
191       radio=None
192       for item in itemlist:
193          number_item=number_item + 1
194          if not item :
195             menu.add_separator()
196          else:
197             label,method=item
198             if type(method) == types.TupleType:
199                # On a un tuple => on cree une cascade
200                menu_cascade=Tkinter.Menu(menu)
201                menu.add_cascade(label=label,menu=menu_cascade)
202                self.cree_menu(menu_cascade,method,appli_composant)
203             elif method[0] == '&':
204                # On a une chaine avec & en tete => on cree un radiobouton
205                command=getattr(appli_composant,method[1:])
206                menu.add_radiobutton(label=label,command=command)
207                if radio == None:radio=number_item
208             else:
209                command=getattr(appli_composant,method)
210                menu.add_command(label=label,command=command)
211       # Si au moins un radiobouton existe on invoke le premier
212       if radio:menu.invoke(radio)
213
214   def fill_menus(self,appli_composant,defs):
215       menudict=self.menubar.menudict
216       for mname,itemlist in defs:
217           menu=menudict.get(mname)
218           if not menu:continue
219           self.cree_menu(menu,itemlist,appli_composant)