Salome HOME
PN : plus d affichage de la faq. demande E. Boyere
[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 fontes
39 import tooltip
40 import properties
41 from widgets import Fenetre
42 from Misc import MakeNomComplet
43
44 VERSION="EFICAS v1.7"
45
46 class APPLI: 
47   def __init__ (self,master,code='ASTER',fichier=None,test=0) :
48       self.top=master
49       self.code=code
50       self.top.protocol("WM_DELETE_WINDOW",self.exitEFICAS)
51       self.top.minsize(900,500)
52       self.top.geometry("900x500")
53       self.top.title(VERSION + ' pour '+self.code)
54       self.top.withdraw()
55       self.initializeTk(master)
56       # L'attribut test permet d'activer les panneaux de splash et d'erreur (test=0)
57       # Si test est different de 0, les panneaux ne sont pas activés
58       self.test=test
59       Pmw.initialise(master)
60       self.lecture_parametres()
61       self.format_fichier = Tkinter.StringVar()
62       self.message=''
63       self.cree_composants_graphiques()
64       self.load_appli_composants()                      # Creation du BUREAU
65       if (self.test == 0):
66            splash.fini_splash()
67            self.affiche_FAQ()
68       # AY : cas ou le nom du fichier a été passé en argument
69       if fichier :
70            fich=str(MakeNomComplet.FILENAME(fichier))
71            if not os.path.isfile(fich):
72               showerror("Fichier inexistant", "Fichier %s en argument n'existe pas" % fich)
73            else:
74               self.bureau.openJDC( fich)
75       # AY : fin
76       # PN : ajout d un attribut pour indiquer si 
77       # l appli a ete lance depuis Salome
78       self.salome=0
79
80      
81
82   def send_message(self,message):
83       self.message=message
84
85   def exitEFICAS(self):
86       self.quit()
87
88   def quit(self):
89       self.top.quit()
90
91   def lecture_parametres(self):
92       """
93           Active la lecture des paramètres standards et utilisateur
94       """
95       if (self.test == 0):
96          splash._splash.configure(text = "Chargement des paramètres utilisateur")
97       import configuration
98       self.CONFIGURATION = configuration.make_config(self,prefs.REPINI)
99
100   def cree_composants_graphiques(self):
101       """
102           Cree les constituants de l'application :
103            - menubar
104            - toolbar
105            - bureau
106            - statusbar
107       """
108       if (self.test == 0):
109          splash._splash.configure(text = "Chargement de l'IHM")
110          splash._splash.configure(text = "Chargement de la menubar")
111       import menubar
112       self.menubar=menubar.MENUBAR(self,self.top)
113       if (self.test == 0):
114          splash._splash.configure(text = "Chargement de la toolbar")
115       import toolbar
116       self.toolbar=toolbar.TOOLBAR(self,self.top)
117       if (self.test == 0):
118          splash._splash.configure(text = "Chargement de la statusbar")
119       import statusbar
120       self.statusbar=statusbar.STATUSBAR(self.top)
121
122   def load_appli_composants(self):
123       if (self.test == 0):
124          splash._splash.configure(text = "Chargement des appli_composants")
125       for mname in self.appli_composants:
126          self.load_appli_composant(mname)
127
128   def load_appli_composant(self,mname):
129       module=__import__(mname,globals(),locals())
130       factory=getattr(module,mname.upper())
131       appli_composant=factory(self,self.top)
132       setattr(self,mname,appli_composant)
133       self.fill_menus(appli_composant,appli_composant.menu_defs)
134       self.toolbar.creer_boutons_appli_composant(appli_composant.button_defs,appli_composant)
135
136   def affiche_FAQ(self):
137       import faq
138       #faq.affiche(self.top)
139
140   def affiche_infos(self,message):
141       self.statusbar.affiche_infos(message)
142       return
143
144   def  initializeTk(self, root):
145         """
146         Initialize platform specific options
147         """
148         if sys.platform == 'mac':
149             self.initializeTk_mac(root)
150         elif sys.platform == 'win32':
151             self.initializeTk_win32(root)
152         else:
153             self.initializeTk_unix(root)
154
155   def initializeTk_win32(self, root):
156         root.option_add('*Font', fontes.standard)
157         root.option_add('*EntryField.Entry.Font', fontes.standard)
158         root.option_add('*Listbox*Font',fontes.standard)
159
160   def initializeTk_colors_common(self, root):
161         root.option_add('*background', 'grey')
162         root.option_add('*foreground', 'black')
163         root.option_add('*EntryField.Entry.background', 'white')
164         root.option_add('*Entry*background', 'white')
165         root.option_add('*Listbox*background', 'white')
166         root.option_add('*Listbox*selectBackground', '#00008b')
167         root.option_add('*Listbox*selectForeground', 'white')
168
169   def initializeTk_mac(self, root):
170         self.initializeTk_colors_common(root)
171
172   def initializeTk_unix(self, root):
173       root.option_add('*Font', fontes.standard)
174       root.option_add('*EntryField.Entry.Font',fontes.standard )
175       root.option_add('*Listbox*Font', fontes.standard)
176       self.initializeTk_colors_common(root)
177
178   def get_texte_infos(self):
179       """
180           Retourne un texte d'informations sur la session courante d'EFICAS
181       """
182       texte = VERSION + '\n\n'
183       texte = texte + 'EFICAS est un produit développé par \nEDF-R&D\n'
184       texte = texte + 'Equipe : SINETICS\n\n'
185       texte = texte + 'Code utilisé : %s version %s\n' % (self.code,properties.version)
186       return texte
187
188   def efface_aide(self,event):
189       """
190           Efface la bulle d'aide d'un panneau
191       """
192       try:
193           self.aide.destroy()
194       except:
195           pass
196       return
197
198   def affiche_aide(self,event,aide):
199       """
200           Affiche l'aide concernant un panneau
201       """
202       x=event.x
203       y=event.y
204       widget=event.widget
205       self.aide=tooltip.TOOLTIP(widget)
206       self.aide.xoffset = 10
207       self.aide.yoffset = - widget.winfo_height()/2
208       self.aide.setText(aide)
209       self.aide._showTip()
210       return 
211
212   def cree_menu(self,menu,itemlist,appli_composant):
213       """
214           Ajoute les items du tuple itemlist
215           dans le menu menu
216       """
217       number_item=0
218       radio=None
219       for item in itemlist:
220          number_item=number_item + 1
221          if not item :
222             menu.add_separator()
223          else:
224             if len(item)==3:
225                raccourci=item[2]
226                newitem=(item[0],item[1])
227             else :
228                raccourci=""
229                newitem=item
230             item=newitem
231             label,method=item
232             if type(method) == types.TupleType:
233                # On a un tuple => on cree une cascade
234                menu_cascade=Tkinter.Menu(menu)
235                menu.add_cascade(label=label,menu=menu_cascade)
236                self.cree_menu(menu_cascade,method,appli_composant)
237             elif method[0] == '&':
238                # On a une chaine avec & en tete => on cree un radiobouton
239                command=getattr(appli_composant,method[1:])
240                menu.add_radiobutton(label=label,command=command)
241                if radio == None:radio=number_item
242             else:
243                command=getattr(appli_composant,method)
244                menu.add_command(label=label,command=command)
245                if raccourci != "" :
246                   self.top.bind(raccourci,command)
247       # Si au moins un radiobouton existe on invoke le premier
248       if radio:menu.invoke(radio)
249
250   def fill_menus(self,appli_composant,defs):
251       menudict=self.menubar.menudict
252       for mname,itemlist in defs:
253           menu=menudict.get(mname)
254           if not menu:continue
255           self.cree_menu(menu,itemlist,appli_composant)
256
257   def update_jdc_courant(self):
258       self.bureau.update_jdc_courant()
259
260   def affiche_alerte(self,titre,message):
261       f=Fenetre(self, titre="Compte-rendu d'erreur", texte = titre + "\n\n" + message)
262       f.wait()
263
264