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