2 # Copyright (C) 2006, Red Hat, Inc.
3 # Copyright (C) 2007, One Laptop Per Child
4 # Copyright (C) 2007 Jan Alonzo <jmalonzo@unpluggable.com>
6 # This program is free software; you can redistribute it and/or modify
7 # it under the terms of the GNU General Public License as published by
8 # the Free Software Foundation; either version 2 of the License, or
9 # (at your option) any later version.
11 # This program is distributed in the hope that it will be useful,
12 # but WITHOUT ANY WARRANTY; without even the implied warranty of
13 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14 # GNU General Public License for more details.
16 # You should have received a copy of the GNU General Public License
17 # along with this program; if not, write to the Free Software
18 # Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
22 from gettext
import gettext
as _
28 class WebToolbar(gtk
.Toolbar
):
29 def __init__(self
, browser
):
30 gtk
.Toolbar
.__init
__(self
)
32 self
._browser
= browser
34 self
._back
= gtk
.ToolButton(gtk
.STOCK_GO_BACK
)
35 self
._back
.set_tooltip(gtk
.Tooltips(),_('Back'))
36 self
._back
.props
.sensitive
= False
37 self
._back
.connect('clicked', self
._go
_back
_cb
)
38 self
.insert(self
._back
, -1)
41 self
._forward
= gtk
.ToolButton(gtk
.STOCK_GO_FORWARD
)
42 self
._forward
.set_tooltip(gtk
.Tooltips(),_('Forward'))
43 self
._forward
.props
.sensitive
= False
44 self
._forward
.connect('clicked', self
._go
_forward
_cb
)
45 self
.insert(self
._forward
, -1)
48 self
._stop
_and
_reload
= gtk
.ToolButton(gtk
.STOCK_REFRESH
)
49 self
._stop
_and
_reload
.connect('clicked', self
._stop
_and
_reload
_cb
)
50 self
.insert(self
._stop
_and
_reload
, -1)
51 self
._stop
_and
_reload
.show()
54 self
._entry
= gtk
.Entry()
55 self
._entry
.connect('activate', self
._entry
_activate
_cb
)
56 self
._current
_uri
= None
58 entry_item
= gtk
.ToolItem()
59 entry_item
.set_expand(True)
60 entry_item
.add(self
._entry
)
63 self
.insert(entry_item
, -1)
66 self
._browser
.connect("title-changed", self
._title
_changed
_cb
)
67 self
._entry
.grab_focus()
69 def set_loading(self
, loading
):
70 self
._loading
= loading
73 self
._show
_stop
_icon
()
74 self
._stop
_and
_reload
.set_tooltip(gtk
.Tooltips(),_('Stop'))
76 self
._show
_reload
_icon
()
77 self
._stop
_and
_reload
.set_tooltip(gtk
.Tooltips(),_('Reload'))
78 self
._update
_navigation
_buttons
()
80 def _set_address(self
, address
):
81 self
._entry
.props
.text
= address
82 self
._current
_uri
= address
84 def _update_navigation_buttons(self
):
85 can_go_back
= self
._browser
.can_go_backward()
86 self
._back
.props
.sensitive
= can_go_back
88 can_go_forward
= self
._browser
.can_go_forward()
89 self
._forward
.props
.sensitive
= can_go_forward
91 def _entry_activate_cb(self
, entry
):
92 self
._browser
.open(entry
.props
.text
)
93 #self._browser.grab_focus()
95 def _go_back_cb(self
, button
):
96 self
._browser
.go_backward()
98 def _go_forward_cb(self
, button
):
99 self
._browser
.go_forward()
101 def _title_changed_cb(self
, widget
, title
, uri
):
102 self
._set
_address
(uri
)
104 def _stop_and_reload_cb(self
, button
):
106 self
._browser
.stop_loading()
108 self
._browser
.reload()
110 def _show_stop_icon(self
):
111 self
._stop
_and
_reload
.set_stock_id(gtk
.STOCK_MEDIA_STOP
)
113 def _show_reload_icon(self
):
114 self
._stop
_and
_reload
.set_stock_id(gtk
.STOCK_REFRESH
)
117 class BrowserPage(webkitgtk
.Page
):
119 webkitgtk
.Page
.__init
__(self
)
121 class WebStatusBar(gtk
.Statusbar
):
123 gtk
.Statusbar
.__init
__(self
)
125 def display(self
, text
, context
=None):
126 cid
= self
.get_context_id("pywebkitgtk")
127 self
.push(cid
, str(text
))
130 class WebBrowser(gtk
.Window
):
132 gtk
.Window
.__init
__(self
)
134 logging
.debug("initializing web browser window")
136 self
._loading
= False
137 self
._browser
= BrowserPage()
138 self
._browser
.connect('load-started', self
._loading
_start
_cb
)
139 self
._browser
.connect('load-progress-changed', self
._loading
_progress
_cb
)
140 self
._browser
.connect('load-finished', self
._loading
_stop
_cb
)
141 self
._browser
.connect("title-changed", self
._title
_changed
_cb
)
142 self
._browser
.connect("hovering-over-link", self
._hover
_link
_cb
)
143 self
._browser
.connect("status-bar-text-changed", self
._statusbar
_text
_changed
_cb
)
144 self
._browser
.connect("icon-loaded", self
._icon
_loaded
_cb
)
145 self
._browser
.connect("selection-changed", self
._selection
_changed
_cb
)
146 self
._browser
.connect("set-scroll-adjustments", self
._set
_scroll
_adjustments
_cb
)
148 self
._scrolled
_window
= gtk
.ScrolledWindow()
149 self
._scrolled
_window
.props
.hscrollbar_policy
= gtk
.POLICY_AUTOMATIC
150 self
._scrolled
_window
.props
.vscrollbar_policy
= gtk
.POLICY_AUTOMATIC
151 self
._scrolled
_window
.add(self
._browser
)
152 self
._scrolled
_window
.show_all()
154 self
._toolbar
= WebToolbar(self
._browser
)
156 self
._statusbar
= WebStatusBar()
158 vbox
= gtk
.VBox(spacing
=4)
159 vbox
.pack_start(self
._toolbar
, expand
=False, fill
=False)
160 vbox
.pack_start(self
._scrolled
_window
)
161 vbox
.pack_end(self
._statusbar
, expand
=False, fill
=False)
164 self
.set_default_size(600, 480)
166 self
.connect('destroy', gtk
.main_quit
)
169 <html><head><title>About</title></head><body>
170 <h1>Welcome to <code>webbrowser.py</code></h1>
171 <p><a href="http://live.gnome.org/PyWebKitGtk">Homepage</a></p>
174 self
._browser
.load_string(about
, "text/html", "iso-8859-15", "about:")
178 def _set_title(self
, title
):
179 self
.props
.title
= title
181 def _loading_start_cb(self
, page
, frame
):
182 main_frame
= self
._browser
.get_main_frame()
183 if frame
is main_frame
:
184 self
._set
_title
(_("Loading %s - %s") % (frame
.get_title(),frame
.get_location()))
185 self
._toolbar
.set_loading(True)
187 def _loading_stop_cb(self
, page
, frame
):
188 # FIXME: another frame may still be loading?
189 self
._toolbar
.set_loading(False)
191 def _loading_progress_cb(self
, page
, progress
):
192 self
._set
_progress
(_("%s%s loaded") % (progress
, '%'))
194 def _set_progress(self
, progress
):
195 self
._statusbar
.display(progress
)
197 def _title_changed_cb(self
, widget
, title
, uri
):
198 self
._set
_title
(_("%s - %s") % (title
,uri
))
200 def _hover_link_cb(self
, url
, base_url
):
201 print "link ", url
, ' ', base_url
203 def _statusbar_text_changed_cb(self
, page
, text
):
204 print "status ", text
206 def _icon_loaded_cb(self
):
209 def _selection_changed_cb(self
):
210 print "selection changed"
212 def _set_scroll_adjustments_cb(self
, page
, hadjustment
, vadjustment
):
213 self
._scrolled
_window
.props
.hadjustment
= hadjustment
214 self
._scrolled
_window
.props
.vadjustment
= vadjustment
216 if __name__
== "__main__":
217 webbrowser
= WebBrowser()