Salome HOME
CCAR : mise a jour avec la version 7.3.23 du Noyau superviseur Aster
[tools/eficas.git] / AIDE / aide_gui.py
1 # -*- coding: utf-8 -*-
2 """
3 Ce module génère l'IHM permettant d'accéder à l'aide en ligne d'une application(ex: EFICAS)
4 Il analyse l'objet index passé en argument et génére automatiquement en conséquence le menu
5 avec liens hyper texte
6 """
7
8 from Tkinter import *
9
10 class AIDE_GUI:
11    """
12    Classe définissant l'IHM de l'appli d'aide
13    """
14    def __init__(self,objet,master=None):
15       self.objet = objet
16       self.master = master
17       self.init()
18       self.init_window()
19       self.init_frames()
20       self.init_buttons()
21       self.init_text()
22       
23    def init(self):
24       """
25       Initialise les structures de données utlisées par l'objet
26       """
27       self.padx = [0,0,0,0]
28       self.padx[0] = 0
29       self.padx[1] = 30
30       self.padx[2] = 50
31       self.historique = []   
32       
33    def init_window(self):
34       """
35       Initialise la fenêtre mère de l'appli
36       """
37       fenetre = Toplevel()
38       if self.master :
39          self.fenetre = fenetre
40       else:
41          self.fenetre = fenetre.master
42          fenetre.destroy()
43       self.fenetre.title(self.objet.titre)
44       self.fenetre.geometry("700x700+50+50")
45       self.fenetre.resizable(1,1)
46       #self.fenetre.minsize(600,800)
47       #self.fenetre.maxsize(900,800)
48       self.fenetre.protocol("WM_DELETE_WINDOW",self.quit)
49       self.fenetre.update()
50          
51    def init_frames(self):
52       """
53       Initialise les frames principales de l'appli
54       """
55       self.frame1 = Frame(self.fenetre,relief='flat',bd=2)
56       self.frame2 = Frame(self.fenetre,relief='flat',bd=2)
57       self.frame1.grid(row=0,column=0,sticky='news')
58       self.frame2.grid(row=1,column=0,sticky='news')
59       self.fenetre.grid_columnconfigure(0,weight=1,minsize=0)
60       self.fenetre.grid_rowconfigure(1,minsize=30)
61       self.fenetre.grid_rowconfigure(0,weight=1,minsize=0)
62       
63    def init_buttons(self):
64       """
65       Crée les boutons dans le bas de la fenêtre
66       """
67       self.b_retour = Button(self.frame2,text = "Précédent",command=self.go_back)
68       self.b_retour.place(relx=0.33,rely=0.5,anchor='center')
69       Button(self.frame2,text="Fermer",command=self.quit).place(relx=0.66,rely=0.5,anchor='center') 
70       
71
72    def init_text(self):
73       """
74       Construit le widget Text qui accueillera l'index et les fichiers
75       """
76       self.scroll_v = Scrollbar(self.frame1)
77       self.scroll_v.grid(row=0,column=1,rowspan=2,sticky='nesw')
78       self.scroll_h = Scrollbar(self.frame1,orient='horizontal')
79       self.scroll_h.grid(row=1,column=0,rowspan=2,sticky='nesw')
80       self.canvas = Canvas(self.frame1,
81                            bg='white',
82                            relief='sunken',
83                            scrollregion=(0,0,1000,1000),
84                            yscrollcommand=self.scroll_v.set,
85                            xscrollcommand=self.scroll_h.set)
86       self.canvas.grid(row=0,column=0,sticky='nesw')
87       self.scroll_v.configure(command=self.canvas.yview)
88       self.scroll_h.configure(command=self.canvas.xview)
89       self.frame1.grid_columnconfigure(0,weight=1,minsize=0)
90       self.frame1.grid_rowconfigure(0,weight=1,minsize=0)
91       self.frame1.grid_rowconfigure(1,minsize=10)
92       self.frame1.grid_columnconfigure(1,minsize=10)
93
94    def build(self):
95       """
96       Lance la construction dynamique de l'index en hyper texte
97       """
98       self.frame1.update_idletasks()
99       largeur = self.frame1.winfo_width()
100       self.canvas.create_rectangle(0,0,1,1,outline='white')
101       self.y_courant = 0
102       # Construction du titre encadré d'une bordure
103       titre = self.canvas.create_text(int(largeur/2),50,anchor='center',text=self.objet.titre,font="Helvetica 12 bold")
104       bbox = self.canvas.bbox(titre)
105       bordure = self.canvas.create_rectangle(bbox[0]-5,bbox[1]-5,bbox[2]+5,bbox[3]+5,
106                                              outline = 'black',
107                                              fill = 'grey75')
108       self.canvas.lower(bordure)                                     
109       self.y_courant += 100
110       # Construction des items
111       for item in self.objet.l_items :
112           self.build_item(item,0)
113       # Affichage du texte dans le fichier associé (s'il existe)
114       if self.objet.fichier :
115          try:
116             texte=open(self.objet.fichier,'r').read()
117          except:
118             texte="Fichier %s inaccessible" % self.objet.fichier
119          self.canvas.create_text(10,self.y_courant+20,
120                                  text=texte,
121                                  anchor='nw')
122       # Configuration dynamique des boutons
123       self.config_boutons()
124       #
125       self.canvas.config(scrollregion=self.canvas.bbox('all'))
126       
127    def config_boutons(self):
128       """
129       Activation du bouton précédent s'il y a lieu
130       """
131       if self.historique : 
132          self.b_retour.config(state='normal')
133       else :
134          self.b_retour.config(state='disabled')
135       
136    def build_item(self,item,padx):
137       """
138       Affiche l'item dans le menu décalé de padx
139       """
140       l = Label(self.canvas,
141                 text=item.titre,
142                 foreground = 'blue',
143                 background='white',
144                 font="Helvetica 12 bold")
145       l.bind("<Button-1>",lambda e,s=self,o=item : s.update_objet(o))
146       l.bind("<Enter>",lambda e,s=self,o=l : s.select_label(o))
147       l.bind("<Leave>",lambda e,s=self,o=l : s.deselect_label(o))
148       self.canvas.create_window(self.padx[padx],self.y_courant,window=l,anchor='w')
149       self.y_courant += 20
150       for sub_item in item.l_items :
151           self.build_item(sub_item,padx+1)
152       
153    def show_file(self,fichier):
154       """
155       Affiche le fichier passé en argument
156       """
157       print "on veut afficher :",fichier
158
159    def select_label(self,label):
160       """
161       Callback invoqué lorsque le label passé en argument est sélectionné
162       """
163       label.config(fg='white',bg='blue')
164
165    def deselect_label(self,label):
166       """
167       Callback invoqué lorsque le label passé en argument est sélectionné
168       """
169       label.config(bg='white',fg='blue')      
170
171    def go_back(self):
172       """
173       Affiche l'item précédent
174       """
175       self.update_objet(self.historique[-1])
176       self.historique = self.historique[0:-1]
177       # Configuration dynamique des boutons
178       self.config_boutons()
179       
180    def update_objet(self,new_objet):
181       """
182       Cette méthode remplace l'objet courant par new_objet.
183       Elle vide le widget text et affiche le nouvel objet
184       """
185       if not self.historique : 
186          self.historique.append(self.objet)
187       elif new_objet is not self.historique[-1] :
188          self.historique.append(self.objet)
189       self.objet = new_objet 
190       self.canvas.delete('all')
191       self.build()
192                        
193    def quit(self):
194       """
195       Ferme l'appli Aide
196       """
197       self.fenetre.destroy()     
198       
199       
200       
201       
202       
203       
204       
205       
206       
207       
208       
209       
210       
211       
212       
213