Salome HOME
CCAR : mise a jour avec la version 7.3.23 du Noyau superviseur Aster
[tools/eficas.git] / AIDE / viewer.py
1 # -*- coding: utf-8 -*-
2 import os
3 import Tkinter
4 import ScrolledText
5 import formatter
6 import htmllib
7
8 class TkWriter(formatter.DumbWriter):
9    def __init__(self, text,viewer):
10       formatter.DumbWriter.__init__(self, self)
11       self.text=text
12       self.viewer=viewer
13
14    def write(self,data):
15       self.text.insert("insert", data)
16
17    def anchor_bgn(self, href, name, type):
18       if href:
19           self.anchor = (href, name, type)
20           self.anchor_mark = self.text.index("insert")
21
22    def anchor_end(self):
23       if self.anchor:
24           url = self.anchor[0]
25           tag = "href_" + url
26           self.text.tag_add(tag, self.anchor_mark, "insert")
27           def displayurl(event,v=self.viewer,u=url):
28              v.display(u)
29           self.text.tag_bind(tag, "<ButtonPress>", displayurl)
30           self.text.tag_config(tag, foreground="blue", underline=1)
31           self.anchor = None
32
33 class HTMLParser(htmllib.HTMLParser):
34     def anchor_bgn(self, href, name, type):
35         htmllib.HTMLParser.anchor_bgn(self, href, name, type)
36         # On signale directement au writer le debut d'une reference
37         self.formatter.writer.anchor_bgn(href, name, type)
38
39     def anchor_end(self):
40         if self.anchor:
41             self.formatter.writer.anchor_end()
42             self.anchor = None
43
44 import string
45
46 class DumbParser:
47     def __init__(self,fmt):
48         self.formatter=fmt
49
50     def feed(self,data):
51         self.formatter.writer.write(data)
52
53     def close(self):
54         pass
55         
56 class Historique:
57    def __init__(self):
58       self.liste=[]
59       self.index=0
60
61    def add(self,url):
62       if self.index > 0:
63           old=self.liste[self.index-1]
64           if url == old :return
65       del self.liste[self.index:]
66       self.liste.append(url)
67       self.index=self.index+1
68
69    def getback(self):
70       if self.index > 1:
71           self.index=self.index-1
72           return self.liste[self.index-1]
73       else:
74           return None
75
76    def getforward(self):
77       if self.index < len(self.liste):
78           url=self.liste[self.index]
79           self.index=self.index+1
80           return url
81       else:
82           return None
83
84 class HTMLViewer:
85    def __init__(self,parent):
86       self.init_window(parent)
87       self.url=None
88       self.home=None
89       self.historique=Historique()
90       self.createWidgets()
91       self.init()
92
93    def init_window(self,parent):
94       self.parent=parent
95       self.fenetre=Tkinter.Toplevel()
96       self.fenetre.title("AIDE EFICAS")
97       if self.fenetre.winfo_screenwidth() < 800 or self.fenetre.winfo_screenheight() < 600:
98          self.fenetre.wm_minsize(300, 150)
99       else:
100          self.fenetre.wm_minsize(400, 200)
101       self.fenetre.protocol("WM_DELETE_WINDOW",self.destroy)
102
103    def createWidgets(self):
104       frame = self.frame = Tkinter.Frame(self.fenetre)
105       frame.pack(side="bottom", fill="x")
106       self.homeButton = Tkinter.Button(frame, text="Index",font="Helvetica 12 bold",
107                                        command=self.goHome)
108       self.homeButton.pack(side="left")
109       self.b_retour = Tkinter.Button(frame, text="Back",font="Helvetica 12 bold",
110                                        command=self.goBack)
111       self.b_retour.pack(side="left")
112       self.b_avance = Tkinter.Button(frame, text="Forward",font="Helvetica 12 bold",
113                                           command=self.goForward)
114       self.b_avance.pack(side="left")
115
116       self.b_close = Tkinter.Button(frame, text="Close",font="Helvetica 12 bold",
117                                         command=self.destroy)
118       self.b_close.pack(side="right")
119       self.config_boutons()
120
121       self.text=ScrolledText.ScrolledText(self.fenetre,bg='white',relief='sunken',font="Helvetica 12 bold")
122       self.text.pack(side="top", fill="both", expand=1)
123       self.text.bind("<Key-Prior>", self.page_up)
124       self.text.bind("<Key-Next>", self.page_down)
125       self.text.bind("<Key-Up>", self.unit_up)
126       self.text.bind("<Key-Down>", self.unit_down)
127       self.text.bind("<1>", self.clicked)
128
129    def clicked(self,event):
130         self.text.focus_set()
131
132    def page_up(self,event):
133         event.widget.yview_scroll(-1, "page")
134    def page_down(self,event):
135         event.widget.yview_scroll(1, "page")
136    def unit_up(self,event):
137         event.widget.yview_scroll(-1, "unit")
138    def unit_down(self,event):
139         event.widget.yview_scroll(1, "unit")
140
141    def config_boutons(self):
142       """
143       Activation du bouton précédent s'il y a lieu
144       """
145       if self.historique.index > 1 :
146          self.b_retour.config(state='normal')
147       else :
148          self.b_retour.config(state='disabled')
149       if self.historique.index < len(self.historique.liste) :
150          self.b_avance.config(state='normal')
151       else :
152          self.b_avance.config(state='disabled')
153
154    def openurl(self,url):
155       url=os.path.normpath(url)
156       if self.url and not os.path.isabs(url):
157          rep1,fich1=os.path.split(self.url)
158          rep2,fich2=os.path.split(url)
159          if rep1 != rep2 :
160             url=os.path.join(rep1,rep2,fich2)
161          url=os.path.normpath(url)
162       try:
163          f=open(url,'r')
164          data=f.read()
165          f.close()
166       except:
167          data="Impossible de trouver: "+url
168       self.url=url
169       if self.home is None:
170          self.home=self.url
171       return data
172
173    def display(self,url):
174       data=self.openurl(url)
175       ext=os.path.splitext(url)[1]
176       self.text.config(state="normal")
177       self.text.delete("1.0", "end")
178       writer=TkWriter(self.text,self)
179       fmt=formatter.AbstractFormatter(writer)
180       if ext == ".html":
181          parser=HTMLParser(fmt)
182       else:
183          parser=DumbParser(fmt)
184       parser.feed(data)
185       parser.close()
186       self.text.config(state="disabled")
187       self.historique.add(url)
188       self.config_boutons()
189
190    def init(self):
191       self.fenetre.bind("<KeyPress-BackSpace>", self.goBack)
192       
193    def goHome(self,event=None):
194       if self.home and self.home != self.url:
195          self.display(self.home)
196
197    def goBack(self,event=None):
198       url=self.historique.getback()
199       if url:self.display(url)
200          
201    def goForward(self,event=None):
202       url=self.historique.getforward()
203       if url:self.display(url)
204
205    def destroy(self):
206        try:
207           self.fenetre.destroy()
208        except:
209           pass
210
211 if __name__ == "__main__":
212     v=HTMLViewer(None)
213     v.display("fichiers/index.html")
214     v.fenetre.mainloop()
215