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