1
# Copyright (C) 2006, Red Hat, Inc.
2
# Copyright (C) 2007, One Laptop Per Child
4
# This program is free software; you can redistribute it and/or modify
5
# it under the terms of the GNU General Public License as published by
6
# the Free Software Foundation; either version 2 of the License, or
7
# (at your option) any later version.
9
# This program is distributed in the hope that it will be useful,
10
# but WITHOUT ANY WARRANTY; without even the implied warranty of
11
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12
# GNU General Public License for more details.
14
# You should have received a copy of the GNU General Public License
15
# along with this program; if not, write to the Free Software
16
# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
20
from gettext import gettext as _
24
from xpcom.components import interfaces
25
from xpcom import components
27
from sugar.graphics.toolbutton import ToolButton
28
from sugar.graphics.menuitem import MenuItem
29
from sugar._sugarext import AddressEntry
33
import progresslistener
36
_MAX_HISTORY_ENTRIES = 15
38
class WebToolbar(gtk.Toolbar):
39
__gtype_name__ = 'WebToolbar'
42
'add-link': (gobject.SIGNAL_RUN_FIRST,
47
def __init__(self, browser):
48
gtk.Toolbar.__init__(self)
50
self._browser = browser
52
self._back = ToolButton('go-previous-paired')
53
self._back.set_tooltip(_('Back'))
54
self._back.props.sensitive = False
55
self._back.connect('clicked', self._go_back_cb)
56
self.insert(self._back, -1)
59
self._forward = ToolButton('go-next-paired')
60
self._forward.set_tooltip(_('Forward'))
61
self._forward.props.sensitive = False
62
self._forward.connect('clicked', self._go_forward_cb)
63
self.insert(self._forward, -1)
66
self._stop_and_reload = ToolButton('media-playback-stop')
67
self._stop_and_reload.connect('clicked', self._stop_and_reload_cb)
68
self.insert(self._stop_and_reload, -1)
69
self._stop_and_reload.show()
71
self._entry = AddressEntry()
72
self._entry.connect('activate', self._entry_activate_cb)
74
entry_item = gtk.ToolItem()
75
entry_item.set_expand(True)
76
entry_item.add(self._entry)
79
self.insert(entry_item, -1)
82
self._link_add = ToolButton('emblem-favorite')
83
self._link_add.set_tooltip(_('Bookmark'))
84
self._link_add.connect('clicked', self._link_add_clicked_cb)
85
self.insert(self._link_add, -1)
88
progress_listener = progresslistener.get_instance()
89
progress_listener.connect('location-changed', self._location_changed_cb)
90
progress_listener.connect('loading-start', self._loading_start_cb)
91
progress_listener.connect('loading-stop', self._loading_stop_cb)
92
progress_listener.connect('loading-progress', self._loading_progress_cb)
94
session_history = sessionhistory.get_instance()
95
session_history.connect('session-history-changed', self._session_history_changed_cb)
97
self._browser.connect("notify::title", self._title_changed_cb)
99
def _session_history_changed_cb(self, session_history, current_page_index):
100
# We have to wait until the history info is updated.
101
gobject.idle_add(self._reload_session_history, current_page_index)
103
def _location_changed_cb(self, progress_listener, uri):
104
cls = components.classes['@mozilla.org/intl/texttosuburi;1']
105
texttosuburi = cls.getService(interfaces.nsITextToSubURI)
106
ui_uri = texttosuburi.unEscapeURIForUI(uri.originCharset, uri.spec)
108
self._set_address(ui_uri)
109
self._update_navigation_buttons()
110
filepicker.cleanup_temp_files()
112
def _loading_start_cb(self, progress_listener):
113
self._set_title(None)
114
self._set_loading(True)
115
self._update_navigation_buttons()
117
def _loading_stop_cb(self, progress_listener):
118
self._set_loading(False)
119
self._update_navigation_buttons()
121
def _loading_progress_cb(self, progress_listener, progress):
122
self._set_progress(progress)
124
def _set_progress(self, progress):
125
self._entry.props.progress = progress
127
def _set_address(self, address):
128
self._entry.props.address = address
130
def _set_title(self, title):
131
self._entry.props.title = title
133
def _show_stop_icon(self):
134
self._stop_and_reload.set_icon('media-playback-stop')
136
def _show_reload_icon(self):
137
self._stop_and_reload.set_icon('view-refresh')
139
def _update_navigation_buttons(self):
140
can_go_back = self._browser.web_navigation.canGoBack
141
self._back.props.sensitive = can_go_back
143
can_go_forward = self._browser.web_navigation.canGoForward
144
self._forward.props.sensitive = can_go_forward
146
def _entry_activate_cb(self, entry):
147
self._browser.load_uri(entry.props.text)
148
self._browser.grab_focus()
150
def _go_back_cb(self, button):
151
self._browser.web_navigation.goBack()
153
def _go_forward_cb(self, button):
154
self._browser.web_navigation.goForward()
156
def _title_changed_cb(self, embed, spec):
157
self._set_title(embed.props.title)
159
def _stop_and_reload_cb(self, button):
161
self._browser.web_navigation.stop(interfaces.nsIWebNavigation.STOP_ALL)
163
flags = interfaces.nsIWebNavigation.LOAD_FLAGS_NONE
164
self._browser.web_navigation.reload(flags)
166
def _set_loading(self, loading):
167
self._loading = loading
170
self._show_stop_icon()
171
self._stop_and_reload.set_tooltip(_('Stop'))
173
self._show_reload_icon()
174
self._stop_and_reload.set_tooltip(_('Reload'))
176
def _reload_session_history(self, current_page_index=None):
177
if current_page_index is None:
178
current_page_index = session_history.index
180
for palette in (self._back.get_palette(), self._forward.get_palette()):
181
for menu_item in palette.menu.get_children():
182
palette.menu.remove(menu_item)
184
session_history = self._browser.web_navigation.sessionHistory
185
if current_page_index > _MAX_HISTORY_ENTRIES:
186
bottom = current_page_index - _MAX_HISTORY_ENTRIES
189
if (session_history.count - current_page_index) > \
190
_MAX_HISTORY_ENTRIES:
191
top = current_page_index + _MAX_HISTORY_ENTRIES + 1
193
top = session_history.count
195
for i in range(bottom, top):
196
if i == current_page_index:
199
entry = session_history.getEntryAtIndex(i, False)
200
menu_item = MenuItem(entry.title, text_maxlen=60)
201
menu_item.connect('activate', self._history_item_activated_cb, i)
203
if i < current_page_index:
204
palette = self._back.get_palette()
205
palette.menu.prepend(menu_item)
206
elif i > current_page_index:
207
palette = self._forward.get_palette()
208
palette.menu.append(menu_item)
212
def _history_item_activated_cb(self, menu_item, index):
213
self._browser.web_navigation.gotoIndex(index)
215
def _link_add_clicked_cb(self, button):
216
self.emit('add-link')