]> SALOME platform Git repositories - tools/eficas.git/blob - Editeur/appli.py
Salome HOME
PN : Ajouts de .comm d exemple
[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 styles
39 from styles import style
40 import fontes
41 import tooltip
42 import properties
43 from widgets import Fenetre
44 from Misc import MakeNomComplet
45 import session
46 import listeFichiers
47 import listePatrons
48
49 VERSION="EFICAS v1.9"
50
51 class APPLI: 
52   def __init__ (self,master,code=prefs.code,fichier=None,test=0) :
53       self.code=code
54       self.top=master
55       self.top.protocol("WM_DELETE_WINDOW",self.exitEFICAS)
56       self.top.minsize(900,500)
57       self.top.geometry("900x500")
58       self.top.title(VERSION + ' pour '+self.code)
59       self.top.withdraw()
60       self.initializeTk(master)
61       Pmw.initialise(master)
62
63       self.dict_reels={}
64       self.liste_simp_reel=[]
65       # L'attribut test permet d'activer les panneaux de splash et d'erreur (test=0)
66       # Si test est different de 0, les panneaux ne sont pas activés
67       self.test=test
68
69       # Lecture des parametres de configuration (fichier global editeur.ini 
70       # et utilisateur eficas.ini)
71       self.lecture_parametres()
72
73       self.format_fichier = Tkinter.StringVar()
74       self.message=''
75       # Avant la creation du bureau qui lit le catalogue
76       self.version_code=session.d_env.cata
77
78       # Creation de la menubar, toolbar, messagebar
79       self.cree_composants_graphiques()
80       # Creation des autres composants graphiques dont le bureau (parametrable par prefs.py)
81       self.load_appli_composants()              
82       self.listeFichiers=listeFichiers.listeFichiers(self)
83       self.listePatrons=listePatrons.listePatrons(self)
84
85       # PN : ajout d un attribut pour indiquer si 
86       # l appli a ete lance depuis Salome
87       self.salome=0
88       self.dir=None
89
90       # Fermer le splash et deiconifier la fenetre principale si on n'est pas en test
91       if (self.test == 0):
92            splash.fini_splash()
93            #self.affiche_FAQ()
94
95       # Ouverture des fichiers de commandes donnes sur la ligne de commande
96       cwd=os.getcwd()
97       self.dir=cwd
98       for study in session.d_env.studies:
99           os.chdir(cwd)
100           d=session.get_unit(study,self)
101           self.bureau.openJDC(file=study["comm"],units=d)
102
103
104   def send_message(self,message):
105       self.message=message
106
107   def exitEFICAS(self):
108       self.quit()
109
110   def quit(self):
111       self.top.quit()
112
113   def lecture_parametres(self):
114       """
115           Active la lecture des paramètres standards et utilisateur
116       """
117       if (self.test == 0):
118          splash._splash.configure(text = "Chargement des paramètres utilisateur")
119       import configuration
120       self.CONFIGURATION = configuration.make_config(self,prefs.REPINI)
121
122   def cree_composants_graphiques(self):
123       """
124           Cree les constituants graphiques fixes de l'application :
125            - menubar
126            - toolbar
127            - statusbar
128       """
129       if (self.test == 0):
130          splash._splash.configure(text = "Chargement de l'IHM")
131          splash._splash.configure(text = "Chargement de la menubar")
132       import menubar
133       self.menubar=menubar.MENUBAR(self,self.top)
134       if (self.test == 0):
135          splash._splash.configure(text = "Chargement de la toolbar")
136       import toolbar
137       self.toolbar=toolbar.TOOLBAR(self,self.top)
138       if (self.test == 0):
139          splash._splash.configure(text = "Chargement de la statusbar")
140       import statusbar
141       self.statusbar=statusbar.STATUSBAR(self.top)
142
143   def load_appli_composants(self):
144       """
145           Cree les autres constituants graphiques de l'application :
146            - bureau 
147            - readercata
148            - ...
149           Cette creation est parametrable par fichier prefs.py
150       """
151       if (self.test == 0):
152          splash._splash.configure(text = "Chargement des appli_composants")
153       for mname in self.appli_composants:
154          self.load_appli_composant(mname)
155
156   def load_appli_composant(self,mname):
157       module=__import__(mname,globals(),locals())
158       factory=getattr(module,mname.upper())
159       appli_composant=factory(self,self.top)
160       setattr(self,mname,appli_composant)
161       self.fill_menus(appli_composant,appli_composant.menu_defs)
162       self.toolbar.creer_boutons_appli_composant(appli_composant.button_defs,appli_composant)
163
164   def affiche_FAQ(self):
165       import faq
166       faq.affiche(self.top)
167
168   def affiche_infos(self,message):
169       self.statusbar.affiche_infos(message)
170       return
171
172   def  initializeTk(self, root):
173         """
174         Initialize platform specific options
175         """
176         if sys.platform == 'mac':
177             self.initializeTk_mac(root)
178         elif sys.platform == 'win32':
179             self.initializeTk_win32(root)
180         else:
181             self.initializeTk_unix(root)
182
183   def initializeTk_win32(self, root):
184         root.option_add('*Font', fontes.standard)
185         root.option_add('*EntryField.Entry.Font', fontes.standard)
186         root.option_add('*Listbox*Font',fontes.standard)
187
188   def initializeTk_colors_common(self, root):
189         root.option_add('*background', style.background)
190         root.option_add('*foreground', style.foreground)
191         root.option_add('*EntryField.Entry.background', style.entry_background)
192         root.option_add('*Entry*background', style.entry_background)
193         root.option_add('*Listbox*background', style.list_background)
194         root.option_add('*Listbox*selectBackground', style.list_select_background)
195         root.option_add('*Listbox*selectForeground', style.list_select_foreground)
196
197   def initializeTk_mac(self, root):
198         self.initializeTk_colors_common(root)
199
200   def initializeTk_unix(self, root):
201       root.option_add('*Font', fontes.standard)
202       root.option_add('*EntryField.Entry.Font',fontes.standard )
203       root.option_add('*Listbox*Font', fontes.standard)
204       self.initializeTk_colors_common(root)
205
206   def get_texte_infos(self):
207       """
208           Retourne un texte d'informations sur la session courante d'EFICAS
209       """
210       texte = VERSION + '\n\n'
211       texte = texte + 'EFICAS est un produit développé par \nEDF-R&D\n'
212       texte = texte + 'Equipe : SINETICS\n\n'
213       texte = texte + 'Code utilisé : %s version %s\n' % (self.code,properties.version)
214       return texte
215
216   def efface_aide(self,event):
217       """
218           Efface la bulle d'aide d'un panneau
219       """
220       try:
221           self.aide.destroy()
222       except:
223           pass
224       return
225
226   def affiche_aide(self,event,aide):
227       """
228           Affiche l'aide concernant un panneau
229       """
230       x=event.x
231       y=event.y
232       widget=event.widget
233       self.aide=tooltip.TOOLTIP(widget)
234       self.aide.xoffset = 10
235       self.aide.yoffset = - widget.winfo_height()/2
236       self.aide.setText(aide)
237       self.aide._showTip()
238       return 
239
240   def cree_menu(self,menu,itemlist,appli_composant):
241       """
242           Ajoute les items du tuple itemlist
243           dans le menu menu
244       """
245       number_item=0
246       radio=None
247       for item in itemlist:
248          number_item=number_item + 1
249          raccourci_label=""
250          if not item :
251             #menu.add_separator()
252             pass
253          else:
254             if len(item)==3:
255                raccourci=item[2]
256                raccourci_label="   "+raccourci
257                newitem=(item[0],item[1])
258             else :
259                if len(item)==4:
260                   raccourci=item[2]
261                   raccourci_label="   "+item[3]
262                   newitem=(item[0],item[1])
263                else :
264                   raccourci=""
265                   newitem=item
266             item=newitem
267             label,method=item
268             if type(method) == types.TupleType:
269                # On a un tuple => on cree une cascade
270                menu_cascade=Tkinter.Menu(menu)
271                menu.add_cascade(label=label,menu=menu_cascade)
272                self.cree_menu(menu_cascade,method,appli_composant)
273             elif method[0] == '&':
274                # On a une chaine avec & en tete => on cree un radiobouton
275                command=getattr(appli_composant,method[1:])
276                menu.add_radiobutton(label=label,command=command)
277                if radio == None:radio=number_item
278             else:
279                command=getattr(appli_composant,method)
280                menu.add_command(label=label,accelerator=raccourci_label,command=command)
281                if raccourci != "" :
282                   self.top.bind(raccourci,command)
283       # Si au moins un radiobouton existe on invoke le premier
284       if radio:menu.invoke(radio)
285
286   def fill_menus(self,appli_composant,defs):
287       menudict=self.menubar.menudict
288       for mname,itemlist in defs:
289           menu=menudict.get(mname)
290           if not menu:continue
291           self.cree_menu(menu,itemlist,appli_composant)
292
293   def update_jdc_courant(self):
294       self.bureau.update_jdc_courant()
295
296   def affiche_alerte(self,titre,message):
297       f=Fenetre(self, titre="Compte-rendu d'erreur", texte = titre + "\n\n" + message)
298       f.wait()
299
300