From fab5b0f0f321fbea2782a7af2734a03962225c38 Mon Sep 17 00:00:00 2001 From: Tomeu Vizoso Date: Wed, 08 Jul 2009 13:49:49 +0000 Subject: Open new windows in tabs --- (limited to 'webtoolbar.py') diff --git a/webtoolbar.py b/webtoolbar.py index 428fd89..f942fa8 100644 --- a/webtoolbar.py +++ b/webtoolbar.py @@ -1,5 +1,6 @@ # Copyright (C) 2006, Red Hat, Inc. # Copyright (C) 2007, One Laptop Per Child +# Copyright (C) 2009, Tomeu Vizoso # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by @@ -220,10 +221,10 @@ class WebToolbar(gtk.Toolbar): ([])) } - def __init__(self, browser): + def __init__(self, tabbed_view): gtk.Toolbar.__init__(self) - self._browser = browser + self._tabbed_view = tabbed_view self._loading = False @@ -262,50 +263,92 @@ class WebToolbar(gtk.Toolbar): self._link_add.connect('clicked', self._link_add_clicked_cb) self.insert(self._link_add, -1) self._link_add.show() - - progress_listener = browser.progress - progress_listener.connect('location-changed', - self._location_changed_cb) - progress_listener.connect('loading-start', self._loading_start_cb) - progress_listener.connect('loading-stop', self._loading_stop_cb) - progress_listener.connect('loading-progress', - self._loading_progress_cb) - self._browser.history.connect('session-history-changed', - self._session_history_changed_cb) + self._progress_listener = None + self._history = None + self._browser = None + + self._location_changed_hid = None + self._loading_changed_hid = None + self._progress_changed_hid = None + self._session_history_changed_hid = None + self._title_changed_hid = None + + gobject.idle_add(lambda: + self._connect_to_browser(tabbed_view.props.current_browser)) + + tabbed_view.connect_after('switch-page', self.__switch_page_cb) + + def __switch_page_cb(self, tabbed_view, page, page_num): + self._connect_to_browser(tabbed_view.props.current_browser) + + def _connect_to_browser(self, browser): + if self._progress_listener is not None: + self._progress_listener.disconnect(self._location_changed_hid) + self._progress_listener.disconnect(self._loading_changed_hid) + self._progress_listener.disconnect(self._progress_changed_hid) + + self._progress_listener = browser.progress + self._set_progress(self._progress_listener.progress) + if self._progress_listener.location: + self._set_address(self._progress_listener.location) + else: + self._set_address(None) + self._set_loading(self._progress_listener.loading) + self._update_navigation_buttons() + + self._location_changed_hid = self._progress_listener.connect( + 'notify::location', self.__location_changed_cb) + self._loading_changed_hid = self._progress_listener.connect( + 'notify::loading', self.__loading_changed_cb) + self._progress_changed_hid = self._progress_listener.connect( + 'notify::progress', self.__progress_changed_cb) - self._browser.connect("notify::title", self._title_changed_cb) + if self._history is not None: + self._history.disconnect(self._session_history_changed_hid) + + self._history = browser.history + self._session_history_changed_hid = self._history.connect( + 'session-history-changed', self._session_history_changed_cb) + + if self._browser is not None: + self._browser.disconnect(self._title_changed_hid) + + self._browser = browser + self._set_title(self._browser.props.title) + + self._title_changed_hid = self._browser.connect( + 'notify::title', self._title_changed_cb) def _session_history_changed_cb(self, session_history, current_page_index): # We have to wait until the history info is updated. gobject.idle_add(self._reload_session_history, current_page_index) - def _location_changed_cb(self, progress_listener, uri): - cls = components.classes['@mozilla.org/intl/texttosuburi;1'] - texttosuburi = cls.getService(interfaces.nsITextToSubURI) - ui_uri = texttosuburi.unEscapeURIForUI(uri.originCharset, uri.spec) - - self._set_address(ui_uri) + def __location_changed_cb(self, progress_listener, pspec): + self._set_address(progress_listener.location) self._update_navigation_buttons() filepicker.cleanup_temp_files() - def _loading_start_cb(self, progress_listener): - self._set_title(None) - self._set_loading(True) + def __loading_changed_cb(self, progress_listener, pspec): + if progress_listener.loading: + self._set_title(None) + self._set_loading(progress_listener.loading) self._update_navigation_buttons() - def _loading_stop_cb(self, progress_listener): - self._set_loading(False) - self._update_navigation_buttons() - - def _loading_progress_cb(self, progress_listener, progress): - self._set_progress(progress) + def __progress_changed_cb(self, progress_listener, pspec): + self._set_progress(progress_listener.progress) def _set_progress(self, progress): self.entry.props.progress = progress - def _set_address(self, address): - self.entry.props.address = address + def _set_address(self, uri): + if uri is not None: + cls = components.classes['@mozilla.org/intl/texttosuburi;1'] + texttosuburi = cls.getService(interfaces.nsITextToSubURI) + ui_uri = texttosuburi.unEscapeURIForUI(uri.originCharset, uri.spec) + else: + ui_uri = None + self.entry.props.address = ui_uri def _set_title(self, title): self.entry.props.title = title @@ -317,32 +360,37 @@ class WebToolbar(gtk.Toolbar): self._stop_and_reload.set_icon('view-refresh') def _update_navigation_buttons(self): - can_go_back = self._browser.web_navigation.canGoBack + browser = self._tabbed_view.props.current_browser + + can_go_back = browser.web_navigation.canGoBack self._back.props.sensitive = can_go_back - can_go_forward = self._browser.web_navigation.canGoForward + can_go_forward = browser.web_navigation.canGoForward self._forward.props.sensitive = can_go_forward def _entry_activate_cb(self, entry): - self._browser.load_uri(entry.props.text) - self._browser.grab_focus() + browser = self._tabbed_view.props.current_browser + browser.load_uri(entry.props.text) + browser.grab_focus() def _go_back_cb(self, button): - self._browser.web_navigation.goBack() + browser = self._tabbed_view.props.current_browser + browser.web_navigation.goBack() def _go_forward_cb(self, button): - self._browser.web_navigation.goForward() + browser = self._tabbed_view.props.current_browser + browser.web_navigation.goForward() def _title_changed_cb(self, embed, spec): self._set_title(embed.props.title) def _stop_and_reload_cb(self, button): + browser = self._tabbed_view.props.current_browser if self._loading: - self._browser.web_navigation.stop( \ - interfaces.nsIWebNavigation.STOP_ALL) + browser.web_navigation.stop(interfaces.nsIWebNavigation.STOP_ALL) else: flags = interfaces.nsIWebNavigation.LOAD_FLAGS_NONE - self._browser.web_navigation.reload(flags) + browser.web_navigation.reload(flags) def _set_loading(self, loading): self._loading = loading @@ -355,7 +403,8 @@ class WebToolbar(gtk.Toolbar): self._stop_and_reload.set_tooltip(_('Reload')) def _reload_session_history(self, current_page_index=None): - session_history = self._browser.web_navigation.sessionHistory + browser = self._tabbed_view.props.current_browser + session_history = browser.web_navigation.sessionHistory if current_page_index is None: current_page_index = session_history.index @@ -391,7 +440,8 @@ class WebToolbar(gtk.Toolbar): menu_item.show() def _history_item_activated_cb(self, menu_item, index): - self._browser.web_navigation.gotoIndex(index) + browser = self._tabbed_view.props.current_browser + browser.web_navigation.gotoIndex(index) def _link_add_clicked_cb(self, button): self.emit('add-link') -- cgit v0.9.1