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