updated documentation
[pywebkitgtk.git] / webbrowser.py
blobbf8b48191dac1b4071b20dd8f087d7abe46e2c05
1 #!/usr/bin/env python
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
20 import os
21 import logging
22 from gettext import gettext as _
24 import gtk
25 import webkitgtk
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)
39 self._back.show()
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)
46 self._forward.show()
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()
52 self._loading = False
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)
61 self._entry.show()
63 self.insert(entry_item, -1)
64 entry_item.show()
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
72 if self._loading:
73 self._show_stop_icon()
74 self._stop_and_reload.set_tooltip(gtk.Tooltips(),_('Stop'))
75 else:
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):
105 if self._loading:
106 self._browser.stop_loading()
107 else:
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):
118 def __init__(self):
119 webkitgtk.Page.__init__(self)
121 class WebStatusBar(gtk.Statusbar):
122 def __init__(self):
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):
131 def __init__(self):
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)
163 self.add(vbox)
164 self.set_default_size(600, 480)
166 self.connect('destroy', gtk.main_quit)
168 about = """
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>
172 </body></html>
174 self._browser.load_string(about, "text/html", "iso-8859-15", "about:")
176 self.show_all()
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):
207 print "icon loaded"
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()
218 gtk.main()