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