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