--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/Helpviewer/HelpWindow.py Mon Dec 28 16:03:33 2009 +0000 @@ -0,0 +1,2824 @@ +# -*- coding: utf-8 -*- + +# Copyright (c) 2002 - 2009 Detlev Offenbach <detlev@die-offenbachs.de> +# + +""" +Module implementing the helpviewer main window. +""" + +import os + +from PyQt4.QtCore import * +from PyQt4.QtGui import * +from PyQt4.QtNetwork import QNetworkProxy +from PyQt4.QtWebKit import QWebSettings +from PyQt4.QtHelp import QHelpEngine, QHelpEngineCore, QHelpSearchQuery + +from SearchWidget import SearchWidget +from HelpBrowserWV import HelpBrowser +from HelpTocWidget import HelpTocWidget +from HelpIndexWidget import HelpIndexWidget +from HelpSearchWidget import HelpSearchWidget +from HelpTopicDialog import HelpTopicDialog +from QtHelpDocumentationDialog import QtHelpDocumentationDialog +from QtHelpFiltersDialog import QtHelpFiltersDialog +from HelpDocsInstaller import HelpDocsInstaller +from HelpWebSearchWidget import HelpWebSearchWidget +from HelpClearPrivateDataDialog import HelpClearPrivateDataDialog +from HelpLanguagesDialog import HelpLanguagesDialog +from CookieJar.CookieJar import CookieJar +from CookieJar.CookiesConfigurationDialog import CookiesConfigurationDialog +from Bookmarks.BookmarksManager import BookmarksManager +from Bookmarks.BookmarksMenu import BookmarksMenuBarMenu +from Bookmarks.BookmarksToolBar import BookmarksToolBar +from Bookmarks.BookmarkNode import BookmarkNode +from Bookmarks.AddBookmarkDialog import AddBookmarkDialog +from Bookmarks.BookmarksDialog import BookmarksDialog +from History.HistoryManager import HistoryManager +from History.HistoryMenu import HistoryMenu +from History.HistoryCompleter import HistoryCompletionModel, HistoryCompleter +from Passwords.PasswordManager import PasswordManager +from Network.NetworkAccessManager import NetworkAccessManager +from AdBlock.AdBlockManager import AdBlockManager + +from E4Gui.E4TabWidget import E4TabWidget +from E4Gui.E4Action import E4Action + +from E4Network.E4NetworkMonitor import E4NetworkMonitor + +import Preferences +from Preferences import Shortcuts +from Preferences.ConfigurationDialog import ConfigurationDialog + +import Utilities + +import UI.PixmapCache +import UI.Config + +from eric4config import getConfig + +class HelpWindow(QMainWindow): + """ + Class implementing the web browser main window. + + @signal helpClosed() emitted after the window was requested to close down + @signal zoomTextOnlyChanged(bool) emitted after the zoom text only setting was + changed + """ + helpwindows = [] + + maxMenuFilePathLen = 75 + + _networkAccessManager = None + _cookieJar = None + _helpEngine = None + _bookmarksManager = None + _historyManager = None + _passwordManager = None + _adblockManager = None + + def __init__(self, home, path, parent, name, fromEric = False, + initShortcutsOnly = False, searchWord = None): + """ + Constructor + + @param home the URL to be shown (string) + @param path the path of the working dir (usually '.') (string) + @param parent parent widget of this window (QWidget) + @param name name of this window (string) + @param fromEric flag indicating whether it was called from within eric4 (boolean) + @keyparam initShortcutsOnly flag indicating to just initialize the keyboard + shortcuts (boolean) + @keyparam searchWord word to search for (string) + """ + QMainWindow.__init__(self, parent) + self.setObjectName(name) + self.setAttribute(Qt.WA_DeleteOnClose) + self.setWindowTitle(self.trUtf8("eric4 Web Browser")) + + self.fromEric = fromEric + self.initShortcutsOnly = initShortcutsOnly + self.setWindowIcon(UI.PixmapCache.getIcon("eric.png")) + + self.mHistory = [] + self.pathCombo = None + + if self.initShortcutsOnly: + self.__initActions() + else: + self.__helpEngine = \ + QHelpEngine(os.path.join(Utilities.getConfigDir(), + "browser", "eric4help.qhc"), self) + self.connect(self.__helpEngine, SIGNAL("warning(const QString&)"), + self.__warning) + self.__helpInstaller = None + + # Attributes for WebKit based browser + self.__progressBar = None + + self.tabContextMenuIndex = -1 + self.tabWidget = E4TabWidget(self, dnd = True) + self.connect(self.tabWidget, SIGNAL('currentChanged(int)'), + self.__currentChanged) + self.tabWidget.setTabContextMenuPolicy(Qt.CustomContextMenu) + self.connect(self.tabWidget, + SIGNAL('customTabContextMenuRequested(const QPoint &, int)'), + self.__showContextMenu) + + self.findDlg = SearchWidget(self, self) + centralWidget = QWidget() + layout = QVBoxLayout() + layout.setContentsMargins(1, 1, 1, 1) + layout.addWidget(self.tabWidget) + layout.addWidget(self.findDlg) + self.tabWidget.setSizePolicy( + QSizePolicy.Preferred, QSizePolicy.Expanding) + centralWidget.setLayout(layout) + self.setCentralWidget(centralWidget) + self.findDlg.hide() + + # setup the TOC widget + self.__tocWindow = HelpTocWidget(self.__helpEngine, self) + self.__tocDock = QDockWidget(self.trUtf8("Contents"), self) + self.__tocDock.setObjectName("TocWindow") + self.__tocDock.setWidget(self.__tocWindow) + self.addDockWidget(Qt.LeftDockWidgetArea, self.__tocDock) + + # setup the index widget + self.__indexWindow = HelpIndexWidget(self.__helpEngine, self) + self.__indexDock = QDockWidget(self.trUtf8("Index"), self) + self.__indexDock.setObjectName("IndexWindow") + self.__indexDock.setWidget(self.__indexWindow) + self.addDockWidget(Qt.LeftDockWidgetArea, self.__indexDock) + + # setup the search widget + self.__searchWord = searchWord + self.__indexing = False + self.__indexingProgress = None + self.__searchEngine = self.__helpEngine.searchEngine() + self.connect(self.__searchEngine, SIGNAL("indexingStarted()"), + self.__indexingStarted) + self.connect(self.__searchEngine, SIGNAL("indexingFinished()"), + self.__indexingFinished) + self.__searchWindow = HelpSearchWidget(self.__searchEngine, self) + self.__searchDock = QDockWidget(self.trUtf8("Search"), self) + self.__searchDock.setObjectName("SearchWindow") + self.__searchDock.setWidget(self.__searchWindow) + self.addDockWidget(Qt.LeftDockWidgetArea, self.__searchDock) + + self.rightCornerWidget = QWidget(self) + self.rightCornerWidgetLayout = QHBoxLayout(self.rightCornerWidget) + self.rightCornerWidgetLayout.setMargin(0) + self.rightCornerWidgetLayout.setSpacing(0) + + self.__navigationMenu = QMenu(self) + self.connect(self.__navigationMenu, SIGNAL("aboutToShow()"), + self.__showNavigationMenu) + self.connect(self.__navigationMenu, SIGNAL("triggered(QAction*)"), + self.__navigationMenuTriggered) + + self.navigationButton = QToolButton(self.tabWidget) + self.navigationButton.setIcon(UI.PixmapCache.getIcon("1downarrow.png")) + self.navigationButton.setToolTip(self.trUtf8("Show a navigation menu")) + self.navigationButton.setPopupMode(QToolButton.InstantPopup) + self.navigationButton.setMenu(self.__navigationMenu) + self.navigationButton.setEnabled(False) + self.rightCornerWidgetLayout.addWidget(self.navigationButton) + + if Preferences.getUI("SingleCloseButton") or \ + not hasattr(self.tabWidget, 'setTabsClosable'): + self.closeButton = QToolButton(self.tabWidget) + self.closeButton.setIcon(UI.PixmapCache.getIcon("close.png")) + self.closeButton.setToolTip(self.trUtf8("Close the current help window")) + self.closeButton.setEnabled(False) + self.connect(self.closeButton, SIGNAL("clicked(bool)"), self.__close) + self.rightCornerWidgetLayout.addWidget(self.closeButton) + else: + self.tabWidget.setTabsClosable(True) + self.connect(self.tabWidget, SIGNAL("tabCloseRequested(int)"), + self.__closeAt) + self.closeButton = None + + self.tabWidget.setCornerWidget(self.rightCornerWidget, Qt.TopRightCorner) + + self.newTabButton = QToolButton(self.tabWidget) + self.newTabButton.setIcon(UI.PixmapCache.getIcon("new.png")) + self.newTabButton.setToolTip(self.trUtf8("Open a new help window tab")) + self.tabWidget.setCornerWidget(self.newTabButton, Qt.TopLeftCorner) + self.connect(self.newTabButton, SIGNAL("clicked(bool)"), self.newTab) + + if Preferences.getHelp("SaveGeometry"): + g = Preferences.getGeometry("HelpViewerGeometry") + else: + g = QByteArray() + if g.isEmpty(): + s = QSize(800, 800) + self.resize(s) + else: + self.restoreGeometry(g) + + self.__setIconDatabasePath() + self.__initWebSettings() + + self.__initActions() + self.__initMenus() + self.__initToolbars() + self.__initTabContextMenu() + + self.historyManager() + + self.newBrowser(home) + self.currentBrowser().setFocus() + + self.__class__.helpwindows.append(self) + + QDesktopServices.setUrlHandler("http", self.__linkActivated) + + # setup connections + # TOC window + self.connect(self.__tocWindow, SIGNAL("linkActivated(const QUrl&)"), + self.__linkActivated) + self.connect(self.__tocWindow, SIGNAL("escapePressed()"), + self.__activateCurrentBrowser) + # index window + self.connect(self.__indexWindow, SIGNAL("linkActivated(const QUrl&)"), + self.__linkActivated) + self.connect(self.__indexWindow, + SIGNAL("linksActivated(const QMap<QString, QUrl>&, const QString&)"), + self.__linksActivated) + self.connect(self.__indexWindow, SIGNAL("escapePressed()"), + self.__activateCurrentBrowser) + # search window + self.connect(self.__searchWindow, SIGNAL("linkActivated(const QUrl&)"), + self.__linkActivated) + self.connect(self.__searchWindow, SIGNAL("escapePressed()"), + self.__activateCurrentBrowser) + + state = Preferences.getHelp("HelpViewerState") + self.restoreState(state) + + self.__initHelpDb() + + QTimer.singleShot(0, self.__lookForNewDocumentation) + if self.__searchWord is not None: + QTimer.singleShot(0, self.__searchForWord) + + def __setIconDatabasePath(self, enable = True): + """ + Private method to set the favicons path. + + @param enable flag indicating to enabled icon storage (boolean) + """ + if enable: + iconDatabasePath = os.path.join(Utilities.getConfigDir(), + "browser", "favicons") + if not os.path.exists(iconDatabasePath): + os.makedirs(iconDatabasePath) + else: + iconDatabasePath = "" # setting an empty path disables it + QWebSettings.setIconDatabasePath(iconDatabasePath) + + def __initWebSettings(self): + """ + Private method to set the global web settings. + """ + standardFont = Preferences.getHelp("StandardFont") + fixedFont = Preferences.getHelp("FixedFont") + + settings = QWebSettings.globalSettings() + settings.setAttribute(QWebSettings.DeveloperExtrasEnabled, True) + + settings.setFontFamily(QWebSettings.StandardFont, standardFont.family()) + settings.setFontSize(QWebSettings.DefaultFontSize, standardFont.pointSize()) + settings.setFontFamily(QWebSettings.FixedFont, fixedFont.family()) + settings.setFontSize(QWebSettings.DefaultFixedFontSize, fixedFont.pointSize()) + + styleSheet = Preferences.getHelp("UserStyleSheet") + if styleSheet: + settings.setUserStyleSheetUrl(QUrl(styleSheet)) + + settings.setAttribute(QWebSettings.AutoLoadImages, + Preferences.getHelp("AutoLoadImages")) + settings.setAttribute(QWebSettings.JavaEnabled, + Preferences.getHelp("JavaEnabled")) + settings.setAttribute(QWebSettings.JavascriptEnabled, + Preferences.getHelp("JavaScriptEnabled")) + settings.setAttribute(QWebSettings.JavascriptCanOpenWindows, + Preferences.getHelp("JavaScriptCanOpenWindows")) + settings.setAttribute(QWebSettings.JavascriptCanAccessClipboard, + Preferences.getHelp("JavaScriptCanAccessClipboard")) + settings.setAttribute(QWebSettings.PluginsEnabled, + Preferences.getHelp("PluginsEnabled")) + + if hasattr(QWebSettings, "PrintElementBackgrounds"): + settings.setAttribute(QWebSettings.PrintElementBackgrounds, + Preferences.getHelp("PrintBackgrounds")) + + def __initActions(self): + """ + Private method to define the user interface actions. + """ + # list of all actions + self.__actions = [] + + self.newTabAct = E4Action(self.trUtf8('New Tab'), + UI.PixmapCache.getIcon("new.png"), + self.trUtf8('&New Tab'), + QKeySequence(self.trUtf8("Ctrl+T","File|New Tab")), + 0, self, 'help_file_new_tab') + self.newTabAct.setStatusTip(self.trUtf8('Open a new help window tab')) + self.newTabAct.setWhatsThis(self.trUtf8( + """<b>New Tab</b>""" + """<p>This opens a new help window tab.</p>""" + )) + self.connect(self.newTabAct, SIGNAL('triggered()'), self.newTab) + self.__actions.append(self.newTabAct) + + self.newAct = E4Action(self.trUtf8('New Window'), + UI.PixmapCache.getIcon("newWindow.png"), + self.trUtf8('New &Window'), + QKeySequence(self.trUtf8("Ctrl+N","File|New Window")), + 0, self, 'help_file_new_window') + self.newAct.setStatusTip(self.trUtf8('Open a new help browser window')) + self.newAct.setWhatsThis(self.trUtf8( + """<b>New Window</b>""" + """<p>This opens a new help browser window.</p>""" + )) + self.connect(self.newAct, SIGNAL('triggered()'), self.newWindow) + self.__actions.append(self.newAct) + + self.openAct = E4Action(self.trUtf8('Open File'), + UI.PixmapCache.getIcon("open.png"), + self.trUtf8('&Open File'), + QKeySequence(self.trUtf8("Ctrl+O","File|Open")), + 0, self, 'help_file_open') + self.openAct.setStatusTip(self.trUtf8('Open a help file for display')) + self.openAct.setWhatsThis(self.trUtf8( + """<b>Open File</b>""" + """<p>This opens a new help file for display.""" + """ It pops up a file selection dialog.</p>""" + )) + self.connect(self.openAct, SIGNAL('triggered()'), self.__openFile) + self.__actions.append(self.openAct) + + self.openTabAct = E4Action(self.trUtf8('Open File in New Tab'), + UI.PixmapCache.getIcon("openNewTab.png"), + self.trUtf8('Open File in New &Tab'), + QKeySequence(self.trUtf8("Shift+Ctrl+O","File|Open in new tab")), + 0, self, 'help_file_open_tab') + self.openTabAct.setStatusTip(\ + self.trUtf8('Open a help file for display in a new tab')) + self.openTabAct.setWhatsThis(self.trUtf8( + """<b>Open File in New Tab</b>""" + """<p>This opens a new help file for display in a new tab.""" + """ It pops up a file selection dialog.</p>""" + )) + self.connect(self.openTabAct, SIGNAL('triggered()'), self.__openFileNewTab) + self.__actions.append(self.openTabAct) + + self.saveAsAct = E4Action(self.trUtf8('Save As '), + UI.PixmapCache.getIcon("fileSaveAs.png"), + self.trUtf8('&Save As...'), + QKeySequence(self.trUtf8("Shift+Ctrl+S","File|Save As")), + 0, self, 'help_file_save_as') + self.saveAsAct.setStatusTip(\ + self.trUtf8('Save the current page to disk')) + self.saveAsAct.setWhatsThis(self.trUtf8( + """<b>Save As...</b>""" + """<p>Saves the current page to disk.</p>""" + )) + self.connect(self.saveAsAct, SIGNAL('triggered()'), self.__savePageAs) + self.__actions.append(self.saveAsAct) + + bookmarksManager = self.bookmarksManager() + self.importBookmarksAct = E4Action(self.trUtf8('Import Bookmarks'), + self.trUtf8('&Import Bookmarks...'), + 0, 0, self, 'help_file_import_bookmarks') + self.importBookmarksAct.setStatusTip(\ + self.trUtf8('Import bookmarks from other browsers')) + self.importBookmarksAct.setWhatsThis(self.trUtf8( + """<b>Import Bookmarks</b>""" + """<p>Import bookmarks from other browsers.</p>""" + )) + self.connect(self.importBookmarksAct, SIGNAL('triggered()'), + bookmarksManager.importBookmarks) + self.__actions.append(self.importBookmarksAct) + + self.exportBookmarksAct = E4Action(self.trUtf8('Export Bookmarks'), + self.trUtf8('&Export Bookmarks...'), + 0, 0, self, 'help_file_export_bookmarks') + self.exportBookmarksAct.setStatusTip(\ + self.trUtf8('Export the bookmarks into a file')) + self.exportBookmarksAct.setWhatsThis(self.trUtf8( + """<b>Export Bookmarks</b>""" + """<p>Export the bookmarks into a file.</p>""" + )) + self.connect(self.exportBookmarksAct, SIGNAL('triggered()'), + bookmarksManager.exportBookmarks) + self.__actions.append(self.exportBookmarksAct) + + self.printAct = E4Action(self.trUtf8('Print'), + UI.PixmapCache.getIcon("print.png"), + self.trUtf8('&Print'), + QKeySequence(self.trUtf8("Ctrl+P","File|Print")), + 0, self, 'help_file_print') + self.printAct.setStatusTip(self.trUtf8('Print the displayed help')) + self.printAct.setWhatsThis(self.trUtf8( + """<b>Print</b>""" + """<p>Print the displayed help text.</p>""" + )) + self.connect(self.printAct, SIGNAL('triggered()'), self.__printFile) + self.__actions.append(self.printAct) + + self.printPreviewAct = E4Action(self.trUtf8('Print Preview'), + UI.PixmapCache.getIcon("printPreview.png"), + self.trUtf8('Print Preview'), + 0, 0, self, 'help_file_print_preview') + self.printPreviewAct.setStatusTip(self.trUtf8( + 'Print preview of the displayed help')) + self.printPreviewAct.setWhatsThis(self.trUtf8( + """<b>Print Preview</b>""" + """<p>Print preview of the displayed help text.</p>""" + )) + self.connect(self.printPreviewAct, SIGNAL('triggered()'), + self.__printPreviewFile) + self.__actions.append(self.printPreviewAct) + + self.closeAct = E4Action(self.trUtf8('Close'), + UI.PixmapCache.getIcon("close.png"), + self.trUtf8('&Close'), + QKeySequence(self.trUtf8("Ctrl+W","File|Close")), + 0, self, 'help_file_close') + self.closeAct.setStatusTip(self.trUtf8('Close the current help window')) + self.closeAct.setWhatsThis(self.trUtf8( + """<b>Close</b>""" + """<p>Closes the current help window.</p>""" + )) + self.connect(self.closeAct, SIGNAL('triggered()'), self.__close) + self.__actions.append(self.closeAct) + + self.closeAllAct = E4Action(self.trUtf8('Close All'), + self.trUtf8('Close &All'), + 0, 0, self, 'help_file_close_all') + self.closeAllAct.setStatusTip(self.trUtf8('Close all help windows')) + self.closeAllAct.setWhatsThis(self.trUtf8( + """<b>Close All</b>""" + """<p>Closes all help windows except the first one.</p>""" + )) + self.connect(self.closeAllAct, SIGNAL('triggered()'), self.__closeAll) + self.__actions.append(self.closeAllAct) + + self.privateBrowsingAct = E4Action(self.trUtf8('Private Browsing'), + UI.PixmapCache.getIcon("privateBrowsing.png"), + self.trUtf8('Private &Browsing'), + 0, 0, self, 'help_file_private_browsing') + self.privateBrowsingAct.setStatusTip(self.trUtf8('Private Browsing')) + self.privateBrowsingAct.setWhatsThis(self.trUtf8( + """<b>Private Browsing</b>""" + """<p>Enables private browsing. In this mode no history is""" + """ recorded anymore.</p>""" + )) + self.connect(self.privateBrowsingAct, SIGNAL('triggered()'), + self.__privateBrowsing) + self.privateBrowsingAct.setCheckable(True) + self.__actions.append(self.privateBrowsingAct) + + self.exitAct = E4Action(self.trUtf8('Quit'), + UI.PixmapCache.getIcon("exit.png"), + self.trUtf8('&Quit'), + QKeySequence(self.trUtf8("Ctrl+Q","File|Quit")), + 0, self, 'help_file_quit') + self.exitAct.setStatusTip(self.trUtf8('Quit the web browser')) + self.exitAct.setWhatsThis(self.trUtf8( + """<b>Quit</b>""" + """<p>Quit the web browser.</p>""" + )) + if self.fromEric: + self.connect(self.exitAct, SIGNAL('triggered()'), self, SLOT('close()')) + else: + self.connect(self.exitAct, SIGNAL('triggered()'), + qApp, SLOT('closeAllWindows()')) + self.__actions.append(self.exitAct) + + self.backAct = E4Action(self.trUtf8('Backward'), + UI.PixmapCache.getIcon("back.png"), + self.trUtf8('&Backward'), + QKeySequence(self.trUtf8("Alt+Left","Go|Backward")), + QKeySequence(self.trUtf8("Backspace","Go|Backward")), + self, 'help_go_backward') + self.backAct.setStatusTip(self.trUtf8('Move one help screen backward')) + self.backAct.setWhatsThis(self.trUtf8( + """<b>Backward</b>""" + """<p>Moves one help screen backward. If none is""" + """ available, this action is disabled.</p>""" + )) + self.connect(self.backAct, SIGNAL('triggered()'), self.__backward) + self.__actions.append(self.backAct) + + self.forwardAct = E4Action(self.trUtf8('Forward'), + UI.PixmapCache.getIcon("forward.png"), + self.trUtf8('&Forward'), + QKeySequence(self.trUtf8("Alt+Right","Go|Forward")), + QKeySequence(self.trUtf8("Shift+Backspace","Go|Forward")), + self, 'help_go_foreward') + self.forwardAct.setStatusTip(self.trUtf8('Move one help screen forward')) + self.forwardAct.setWhatsThis(self.trUtf8( + """<b>Forward</b>""" + """<p>Moves one help screen forward. If none is""" + """ available, this action is disabled.</p>""" + )) + self.connect(self.forwardAct, SIGNAL('triggered()'), self.__forward) + self.__actions.append(self.forwardAct) + + self.homeAct = E4Action(self.trUtf8('Home'), + UI.PixmapCache.getIcon("home.png"), + self.trUtf8('&Home'), + QKeySequence(self.trUtf8("Ctrl+Home","Go|Home")), + 0, self, 'help_go_home') + self.homeAct.setStatusTip(self.trUtf8('Move to the initial help screen')) + self.homeAct.setWhatsThis(self.trUtf8( + """<b>Home</b>""" + """<p>Moves to the initial help screen.</p>""" + )) + self.connect(self.homeAct, SIGNAL('triggered()'), self.__home) + self.__actions.append(self.homeAct) + + self.reloadAct = E4Action(self.trUtf8('Reload'), + UI.PixmapCache.getIcon("reload.png"), + self.trUtf8('&Reload'), + QKeySequence(self.trUtf8("Ctrl+R","Go|Reload")), + QKeySequence(self.trUtf8("F5","Go|Reload")), + self, 'help_go_reload') + self.reloadAct.setStatusTip(self.trUtf8('Reload the current help screen')) + self.reloadAct.setWhatsThis(self.trUtf8( + """<b>Reload</b>""" + """<p>Reloads the current help screen.</p>""" + )) + self.connect(self.reloadAct, SIGNAL('triggered()'), self.__reload) + self.__actions.append(self.reloadAct) + + self.stopAct = E4Action(self.trUtf8('Stop'), + UI.PixmapCache.getIcon("stopLoading.png"), + self.trUtf8('&Stop'), + QKeySequence(self.trUtf8("Ctrl+.","Go|Stop")), + QKeySequence(self.trUtf8("Esc","Go|Stop")), + self, 'help_go_stop') + self.stopAct.setStatusTip(self.trUtf8('Stop loading')) + self.stopAct.setWhatsThis(self.trUtf8( + """<b>Stop</b>""" + """<p>Stops loading of the current tab.</p>""" + )) + self.connect(self.stopAct, SIGNAL('triggered()'), self.__stopLoading) + self.__actions.append(self.stopAct) + + self.copyAct = E4Action(self.trUtf8('Copy'), + UI.PixmapCache.getIcon("editCopy.png"), + self.trUtf8('&Copy'), + QKeySequence(self.trUtf8("Ctrl+C","Edit|Copy")), + 0, self, 'help_edit_copy') + self.copyAct.setStatusTip(self.trUtf8('Copy the selected text')) + self.copyAct.setWhatsThis(self.trUtf8( + """<b>Copy</b>""" + """<p>Copy the selected text to the clipboard.</p>""" + )) + self.connect(self.copyAct, SIGNAL('triggered()'), self.__copy) + self.__actions.append(self.copyAct) + + self.findAct = E4Action(self.trUtf8('Find...'), + UI.PixmapCache.getIcon("find.png"), + self.trUtf8('&Find...'), + QKeySequence(self.trUtf8("Ctrl+F","Edit|Find")), + 0, self, 'help_edit_find') + self.findAct.setStatusTip(self.trUtf8('Find text in page')) + self.findAct.setWhatsThis(self.trUtf8( + """<b>Find</b>""" + """<p>Find text in the current page.</p>""" + )) + self.connect(self.findAct, SIGNAL('triggered()'), self.__find) + self.__actions.append(self.findAct) + + self.findNextAct = E4Action(self.trUtf8('Find next'), + UI.PixmapCache.getIcon("findNext.png"), + self.trUtf8('Find &next'), + QKeySequence(self.trUtf8("F3","Edit|Find next")), + 0, self, 'help_edit_find_next') + self.findNextAct.setStatusTip(self.trUtf8('Find next occurrence of text in page')) + self.findNextAct.setWhatsThis(self.trUtf8( + """<b>Find next</b>""" + """<p>Find the next occurrence of text in the current page.</p>""" + )) + if not self.initShortcutsOnly: + self.connect(self.findNextAct, SIGNAL('triggered()'), self.findDlg.findNext) + self.__actions.append(self.findNextAct) + + self.findPrevAct = E4Action(self.trUtf8('Find previous'), + UI.PixmapCache.getIcon("findPrev.png"), + self.trUtf8('Find &previous'), + QKeySequence(self.trUtf8("Shift+F3","Edit|Find previous")), + 0, self, 'help_edit_find_previous') + self.findPrevAct.setStatusTip(\ + self.trUtf8('Find previous occurrence of text in page')) + self.findPrevAct.setWhatsThis(self.trUtf8( + """<b>Find previous</b>""" + """<p>Find the previous occurrence of text in the current page.</p>""" + )) + if not self.initShortcutsOnly: + self.connect(self.findPrevAct, SIGNAL('triggered()'), + self.findDlg.findPrevious) + self.__actions.append(self.findPrevAct) + + self.bookmarksManageAct = E4Action(self.trUtf8('Manage Bookmarks'), + self.trUtf8('&Manage Bookmarks...'), + QKeySequence(self.trUtf8("Ctrl+Shift+B", "Help|Manage bookmarks")), + 0, self, 'help_bookmarks_manage') + self.bookmarksManageAct.setStatusTip(self.trUtf8( + 'Open a dialog to manage the bookmarks.')) + self.bookmarksManageAct.setWhatsThis(self.trUtf8( + """<b>Manage Bookmarks...</b>""" + """<p>Open a dialog to manage the bookmarks.</p>""" + )) + self.connect(self.bookmarksManageAct, SIGNAL('triggered()'), + self.__showBookmarksDialog) + self.__actions.append(self.bookmarksManageAct) + + self.bookmarksAddAct = E4Action(self.trUtf8('Add Bookmark'), + UI.PixmapCache.getIcon("addBookmark.png"), + self.trUtf8('Add &Bookmark...'), + QKeySequence(self.trUtf8("Ctrl+D", "Help|Add bookmark")), + 0, self, 'help_bookmark_add') + self.bookmarksAddAct.setIconVisibleInMenu(False) + self.bookmarksAddAct.setStatusTip(self.trUtf8('Open a dialog to add a bookmark.')) + self.bookmarksAddAct.setWhatsThis(self.trUtf8( + """<b>Add Bookmark</b>""" + """<p>Open a dialog to add the current URL as a bookmark.</p>""" + )) + self.connect(self.bookmarksAddAct, SIGNAL('triggered()'), self.__addBookmark) + self.__actions.append(self.bookmarksAddAct) + + self.bookmarksAddFolderAct = E4Action(self.trUtf8('Add Folder'), + self.trUtf8('Add &Folder...'), + 0, 0, self, 'help_bookmark_show_all') + self.bookmarksAddFolderAct.setStatusTip(self.trUtf8( + 'Open a dialog to add a new bookmarks folder.')) + self.bookmarksAddFolderAct.setWhatsThis(self.trUtf8( + """<b>Add Folder...</b>""" + """<p>Open a dialog to add a new bookmarks folder.</p>""" + )) + self.connect(self.bookmarksAddFolderAct, SIGNAL('triggered()'), + self.__addBookmarkFolder) + self.__actions.append(self.bookmarksAddFolderAct) + + self.bookmarksAllTabsAct = E4Action(self.trUtf8('Bookmark All Tabs'), + self.trUtf8('Bookmark All Tabs...'), + 0, 0, self, 'help_bookmark_all_tabs') + self.bookmarksAllTabsAct.setStatusTip(self.trUtf8( + 'Bookmark all open tabs.')) + self.bookmarksAllTabsAct.setWhatsThis(self.trUtf8( + """<b>Bookmark All Tabs...</b>""" + """<p>Open a dialog to add a new bookmarks folder for""" + """ all open tabs.</p>""" + )) + self.connect(self.bookmarksAllTabsAct, SIGNAL('triggered()'), + self.__bookmarkAll) + self.__actions.append(self.bookmarksAllTabsAct) + + self.whatsThisAct = E4Action(self.trUtf8('What\'s This?'), + UI.PixmapCache.getIcon("whatsThis.png"), + self.trUtf8('&What\'s This?'), + QKeySequence(self.trUtf8("Shift+F1","Help|What's This?'")), + 0, self, 'help_help_whats_this') + self.whatsThisAct.setStatusTip(self.trUtf8('Context sensitive help')) + self.whatsThisAct.setWhatsThis(self.trUtf8( + """<b>Display context sensitive help</b>""" + """<p>In What's This? mode, the mouse cursor shows an arrow with a""" + """ question mark, and you can click on the interface elements to get""" + """ a short description of what they do and how to use them. In""" + """ dialogs, this feature can be accessed using the context help button""" + """ in the titlebar.</p>""" + )) + self.connect(self.whatsThisAct, SIGNAL('triggered()'), self.__whatsThis) + self.__actions.append(self.whatsThisAct) + + self.aboutAct = E4Action(self.trUtf8('About'), + self.trUtf8('&About'), + 0, 0, self, 'help_help_about') + self.aboutAct.setStatusTip(self.trUtf8('Display information about this software')) + self.aboutAct.setWhatsThis(self.trUtf8( + """<b>About</b>""" + """<p>Display some information about this software.</p>""" + )) + self.connect(self.aboutAct, SIGNAL('triggered()'), self.__about) + self.__actions.append(self.aboutAct) + + self.aboutQtAct = E4Action(self.trUtf8('About Qt'), + self.trUtf8('About &Qt'), + 0, 0, self, 'help_help_about_qt') + self.aboutQtAct.setStatusTip(\ + self.trUtf8('Display information about the Qt toolkit')) + self.aboutQtAct.setWhatsThis(self.trUtf8( + """<b>About Qt</b>""" + """<p>Display some information about the Qt toolkit.</p>""" + )) + self.connect(self.aboutQtAct, SIGNAL('triggered()'), self.__aboutQt) + self.__actions.append(self.aboutQtAct) + + self.zoomInAct = E4Action(self.trUtf8('Zoom in'), + UI.PixmapCache.getIcon("zoomIn.png"), + self.trUtf8('Zoom &in'), + QKeySequence(self.trUtf8("Ctrl++","View|Zoom in")), + 0, self, 'help_view_zoom_in') + self.zoomInAct.setStatusTip(self.trUtf8('Zoom in on the text')) + self.zoomInAct.setWhatsThis(self.trUtf8( + """<b>Zoom in</b>""" + """<p>Zoom in on the text. This makes the text bigger.</p>""" + )) + self.connect(self.zoomInAct, SIGNAL('triggered()'), self.__zoomIn) + self.__actions.append(self.zoomInAct) + + self.zoomOutAct = E4Action(self.trUtf8('Zoom out'), + UI.PixmapCache.getIcon("zoomOut.png"), + self.trUtf8('Zoom &out'), + QKeySequence(self.trUtf8("Ctrl+-","View|Zoom out")), + 0, self, 'help_view_zoom_out') + self.zoomOutAct.setStatusTip(self.trUtf8('Zoom out on the text')) + self.zoomOutAct.setWhatsThis(self.trUtf8( + """<b>Zoom out</b>""" + """<p>Zoom out on the text. This makes the text smaller.</p>""" + )) + self.connect(self.zoomOutAct, SIGNAL('triggered()'), self.__zoomOut) + self.__actions.append(self.zoomOutAct) + + self.zoomResetAct = E4Action(self.trUtf8('Zoom reset'), + UI.PixmapCache.getIcon("zoomReset.png"), + self.trUtf8('Zoom &reset'), + QKeySequence(self.trUtf8("Ctrl+0","View|Zoom reset")), + 0, self, 'help_view_zoom_reset') + self.zoomResetAct.setStatusTip(self.trUtf8('Reset the zoom of the text')) + self.zoomResetAct.setWhatsThis(self.trUtf8( + """<b>Zoom reset</b>""" + """<p>Reset the zoom of the text. """ + """This sets the zoom factor to 100%.</p>""" + )) + self.connect(self.zoomResetAct, SIGNAL('triggered()'), self.__zoomReset) + self.__actions.append(self.zoomResetAct) + + if hasattr(QWebSettings, 'ZoomTextOnly'): + self.zoomTextOnlyAct = E4Action(self.trUtf8('Zoom text only'), + self.trUtf8('Zoom &text only'), + 0, 0, self, 'help_view_zoom_text_only') + self.zoomTextOnlyAct.setCheckable(True) + self.zoomTextOnlyAct.setStatusTip(self.trUtf8( + 'Zoom text only; pictures remain constant')) + self.zoomTextOnlyAct.setWhatsThis(self.trUtf8( + """<b>Zoom text only</b>""" + """<p>Zoom text only; pictures remain constant.</p>""" + )) + self.connect(self.zoomTextOnlyAct, SIGNAL('triggered(bool)'), + self.__zoomTextOnly) + self.__actions.append(self.zoomTextOnlyAct) + else: + self.zoomTextOnlyAct = None + + self.pageSourceAct = E4Action(self.trUtf8('Show page source'), + self.trUtf8('Show page source'), + QKeySequence(self.trUtf8('Ctrl+U')), 0, + self, 'help_show_page_source') + self.pageSourceAct.setStatusTip(self.trUtf8('Show the page source in an editor')) + self.pageSourceAct.setWhatsThis(self.trUtf8( + """<b>Show page source</b>""" + """<p>Show the page source in an editor.</p>""" + )) + self.connect(self.pageSourceAct, SIGNAL('triggered()'), self.__showPageSource) + self.__actions.append(self.pageSourceAct) + self.addAction(self.pageSourceAct) + + self.fullScreenAct = E4Action(self.trUtf8('Full Screen'), + UI.PixmapCache.getIcon("windowFullscreen.png"), + self.trUtf8('&Full Screen'), + QKeySequence(self.trUtf8('F11')), 0, + self, 'help_view_full_scree') + self.connect(self.fullScreenAct, SIGNAL('triggered()'), self.__viewFullScreen) + self.__actions.append(self.fullScreenAct) + self.addAction(self.fullScreenAct) + + self.nextTabAct = E4Action(self.trUtf8('Show next tab'), + self.trUtf8('Show next tab'), + QKeySequence(self.trUtf8('Ctrl+Alt+Tab')), 0, + self, 'help_view_next_tab') + self.connect(self.nextTabAct, SIGNAL('triggered()'), self.__nextTab) + self.__actions.append(self.nextTabAct) + self.addAction(self.nextTabAct) + + self.prevTabAct = E4Action(self.trUtf8('Show previous tab'), + self.trUtf8('Show previous tab'), + QKeySequence(self.trUtf8('Shift+Ctrl+Alt+Tab')), 0, + self, 'help_view_previous_tab') + self.connect(self.prevTabAct, SIGNAL('triggered()'), self.__prevTab) + self.__actions.append(self.prevTabAct) + self.addAction(self.prevTabAct) + + self.switchTabAct = E4Action(self.trUtf8('Switch between tabs'), + self.trUtf8('Switch between tabs'), + QKeySequence(self.trUtf8('Ctrl+1')), 0, + self, 'help_switch_tabs') + self.connect(self.switchTabAct, SIGNAL('triggered()'), self.__switchTab) + self.__actions.append(self.switchTabAct) + self.addAction(self.switchTabAct) + + self.prefAct = E4Action(self.trUtf8('Preferences'), + UI.PixmapCache.getIcon("configure.png"), + self.trUtf8('&Preferences...'), 0, 0, self, 'help_preferences') + self.prefAct.setStatusTip(self.trUtf8('Set the prefered configuration')) + self.prefAct.setWhatsThis(self.trUtf8( + """<b>Preferences</b>""" + """<p>Set the configuration items of the application""" + """ with your prefered values.</p>""" + )) + self.connect(self.prefAct, SIGNAL('triggered()'), self.__showPreferences) + self.__actions.append(self.prefAct) + + self.acceptedLanguagesAct = E4Action(self.trUtf8('Languages'), + UI.PixmapCache.getIcon("flag.png"), + self.trUtf8('&Languages...'), 0, 0, self, 'help_accepted_languages') + self.acceptedLanguagesAct.setStatusTip(self.trUtf8( + 'Configure the accepted languages for web pages')) + self.acceptedLanguagesAct.setWhatsThis(self.trUtf8( + """<b>Languages</b>""" + """<p>Configure the accepted languages for web pages.</p>""" + )) + self.connect(self.acceptedLanguagesAct, SIGNAL('triggered()'), + self.__showAcceptedLanguages) + self.__actions.append(self.acceptedLanguagesAct) + + self.cookiesAct = E4Action(self.trUtf8('Cookies'), + UI.PixmapCache.getIcon("cookie.png"), + self.trUtf8('C&ookies...'), 0, 0, self, 'help_cookies') + self.cookiesAct.setStatusTip(self.trUtf8( + 'Configure cookies handling')) + self.cookiesAct.setWhatsThis(self.trUtf8( + """<b>Cookies</b>""" + """<p>Configure cookies handling.</p>""" + )) + self.connect(self.cookiesAct, SIGNAL('triggered()'), + self.__showCookiesConfiguration) + self.__actions.append(self.cookiesAct) + + self.syncTocAct = E4Action(self.trUtf8('Sync with Table of Contents'), + UI.PixmapCache.getIcon("syncToc.png"), + self.trUtf8('Sync with Table of Contents'), + 0, 0, self, 'help_sync_toc') + self.syncTocAct.setStatusTip(self.trUtf8( + 'Synchronizes the table of contents with current page')) + self.syncTocAct.setWhatsThis(self.trUtf8( + """<b>Sync with Table of Contents</b>""" + """<p>Synchronizes the table of contents with current page.</p>""" + )) + self.connect(self.syncTocAct, SIGNAL('triggered()'), self.__syncTOC) + self.__actions.append(self.syncTocAct) + + self.showTocAct = E4Action(self.trUtf8('Table of Contents'), + self.trUtf8('Table of Contents'), + 0, 0, self, 'help_show_toc') + self.showTocAct.setStatusTip(self.trUtf8( + 'Shows the table of contents window')) + self.showTocAct.setWhatsThis(self.trUtf8( + """<b>Table of Contents</b>""" + """<p>Shows the table of contents window.</p>""" + )) + self.connect(self.showTocAct, SIGNAL('triggered()'), self.__showTocWindow) + self.__actions.append(self.showTocAct) + + self.showIndexAct = E4Action(self.trUtf8('Index'), + self.trUtf8('Index'), + 0, 0, self, 'help_show_index') + self.showIndexAct.setStatusTip(self.trUtf8( + 'Shows the index window')) + self.showIndexAct.setWhatsThis(self.trUtf8( + """<b>Index</b>""" + """<p>Shows the index window.</p>""" + )) + self.connect(self.showIndexAct, SIGNAL('triggered()'), self.__showIndexWindow) + self.__actions.append(self.showIndexAct) + + self.showSearchAct = E4Action(self.trUtf8('Search'), + self.trUtf8('Search'), + 0, 0, self, 'help_show_search') + self.showSearchAct.setStatusTip(self.trUtf8( + 'Shows the search window')) + self.showSearchAct.setWhatsThis(self.trUtf8( + """<b>Search</b>""" + """<p>Shows the search window.</p>""" + )) + self.connect(self.showSearchAct, SIGNAL('triggered()'), self.__showSearchWindow) + self.__actions.append(self.showSearchAct) + + self.manageQtHelpDocsAct = E4Action(self.trUtf8('Manage QtHelp Documents'), + self.trUtf8('Manage QtHelp &Documents'), + 0, 0, self, 'help_qthelp_documents') + self.manageQtHelpDocsAct.setStatusTip(self.trUtf8( + 'Shows a dialog to manage the QtHelp documentation set')) + self.manageQtHelpDocsAct.setWhatsThis(self.trUtf8( + """<b>Manage QtHelp Documents</b>""" + """<p>Shows a dialog to manage the QtHelp documentation set.</p>""" + )) + self.connect(self.manageQtHelpDocsAct, SIGNAL('triggered()'), + self.__manageQtHelpDocumentation) + self.__actions.append(self.manageQtHelpDocsAct) + + self.manageQtHelpFiltersAct = E4Action(self.trUtf8('Manage QtHelp Filters'), + self.trUtf8('Manage QtHelp &Filters'), + 0, 0, self, 'help_qthelp_filters') + self.manageQtHelpFiltersAct.setStatusTip(self.trUtf8( + 'Shows a dialog to manage the QtHelp filters')) + self.manageQtHelpFiltersAct.setWhatsThis(self.trUtf8( + """<b>Manage QtHelp Filters</b>""" + """<p>Shows a dialog to manage the QtHelp filters.</p>""" + )) + self.connect(self.manageQtHelpFiltersAct, SIGNAL('triggered()'), + self.__manageQtHelpFilters) + self.__actions.append(self.manageQtHelpFiltersAct) + + self.reindexDocumentationAct = E4Action(self.trUtf8('Reindex Documentation'), + self.trUtf8('&Reindex Documentation'), + 0, 0, self, 'help_qthelp_reindex') + self.reindexDocumentationAct.setStatusTip(self.trUtf8( + 'Reindexes the documentation set')) + self.reindexDocumentationAct.setWhatsThis(self.trUtf8( + """<b>Reindex Documentation</b>""" + """<p>Reindexes the documentation set.</p>""" + )) + if not self.initShortcutsOnly: + self.connect(self.reindexDocumentationAct, SIGNAL('triggered()'), + self.__searchEngine.reindexDocumentation) + self.__actions.append(self.reindexDocumentationAct) + + self.clearPrivateDataAct = E4Action(self.trUtf8('Clear private data'), + self.trUtf8('&Clear private data'), + 0, 0, + self, 'help_clear_private_data') + self.clearPrivateDataAct.setStatusTip(self.trUtf8('Clear private data')) + self.clearPrivateDataAct.setWhatsThis(self.trUtf8( + """<b>Clear private data</b>""" + """<p>Clears the private data like browsing history, search history""" + """ or the favicons database.</p>""" + )) + self.connect(self.clearPrivateDataAct, SIGNAL('triggered()'), + self.__clearPrivateData) + self.__actions.append(self.clearPrivateDataAct) + + self.clearIconsAct = E4Action(self.trUtf8('Clear icons database'), + self.trUtf8('Clear &icons database'), + 0, 0, + self, 'help_clear_icons_db') + self.clearIconsAct.setStatusTip(self.trUtf8('Clear the database of favicons')) + self.clearIconsAct.setWhatsThis(self.trUtf8( + """<b>Clear icons database</b>""" + """<p>Clears the database of favicons of previously visited URLs.</p>""" + )) + self.connect(self.clearIconsAct, SIGNAL('triggered()'), self.__clearIconsDatabase) + self.__actions.append(self.clearIconsAct) + + self.searchEnginesAct = E4Action(self.trUtf8('Configure Search Engines'), + self.trUtf8('Configure &Search Engines...'), + 0, 0, + self, 'help_search_engines') + self.searchEnginesAct.setStatusTip(self.trUtf8( + 'Configure the available search engines')) + self.searchEnginesAct.setWhatsThis(self.trUtf8( + """<b>Configure Search Engines...</b>""" + """<p>Opens a dialog to configure the available search engines.</p>""" + )) + self.connect(self.searchEnginesAct, SIGNAL('triggered()'), + self.__showEnginesConfigurationDialog) + self.__actions.append(self.searchEnginesAct) + + self.passwordsAct = E4Action(self.trUtf8('Manage Saved Passwords'), + self.trUtf8('Manage Saved Passwords...'), + 0, 0, + self, 'help_manage_passwords') + self.passwordsAct.setStatusTip(self.trUtf8( + 'Manage the saved passwords')) + self.passwordsAct.setWhatsThis(self.trUtf8( + """<b>Manage Saved Passwords...</b>""" + """<p>Opens a dialog to manage the saved passwords.</p>""" + )) + self.connect(self.passwordsAct, SIGNAL('triggered()'), + self.__showPasswordsDialog) + self.__actions.append(self.passwordsAct) + + self.adblockAct = E4Action(self.trUtf8('Ad Block'), + self.trUtf8('&Ad Block...'), + 0, 0, + self, 'help_adblock') + self.adblockAct.setStatusTip(self.trUtf8( + 'Configure AdBlock subscriptions and rules')) + self.adblockAct.setWhatsThis(self.trUtf8( + """<b>Ad Block...</b>""" + """<p>Opens a dialog to configure AdBlock subscriptions and rules.</p>""" + )) + self.connect(self.adblockAct, SIGNAL('triggered()'), + self.__showAdBlockDialog) + self.__actions.append(self.adblockAct) + + self.toolsMonitorAct = E4Action(self.trUtf8('Show Network Monitor'), + self.trUtf8('Show &Network Monitor'), + 0, 0, + self, 'help_tools_network_monitor') + self.toolsMonitorAct.setStatusTip(self.trUtf8('Show the network monitor dialog')) + self.toolsMonitorAct.setWhatsThis(self.trUtf8( + """<b>Show Network Monitor</b>""" + """<p>Shows the network monitor dialog.</p>""" + )) + self.connect(self.toolsMonitorAct, SIGNAL('triggered()'), + self.__showNetworkMonitor) + self.__actions.append(self.toolsMonitorAct) + + self.backAct.setEnabled(False) + self.forwardAct.setEnabled(False) + + # now read the keyboard shortcuts for the actions + Shortcuts.readShortcuts(helpViewer = self) + + def getActions(self): + """ + Public method to get a list of all actions. + + @return list of all actions (list of E4Action) + """ + return self.__actions[:] + + def __initMenus(self): + """ + Private method to create the menus. + """ + mb = self.menuBar() + + menu = mb.addMenu(self.trUtf8('&File')) + menu.setTearOffEnabled(True) + menu.addAction(self.newTabAct) + menu.addAction(self.newAct) + menu.addAction(self.openAct) + menu.addAction(self.openTabAct) + menu.addSeparator() + menu.addAction(self.saveAsAct) + menu.addSeparator() + menu.addAction(self.importBookmarksAct) + menu.addAction(self.exportBookmarksAct) + menu.addSeparator() + menu.addAction(self.printPreviewAct) + menu.addAction(self.printAct) + menu.addSeparator() + menu.addAction(self.closeAct) + menu.addAction(self.closeAllAct) + menu.addSeparator() + menu.addAction(self.privateBrowsingAct) + menu.addSeparator() + menu.addAction(self.exitAct) + + menu = mb.addMenu(self.trUtf8('&Edit')) + menu.setTearOffEnabled(True) + menu.addAction(self.copyAct) + menu.addSeparator() + menu.addAction(self.findAct) + menu.addAction(self.findNextAct) + menu.addAction(self.findPrevAct) + + menu = mb.addMenu(self.trUtf8('&View')) + menu.setTearOffEnabled(True) + menu.addAction(self.zoomInAct) + menu.addAction(self.zoomResetAct) + menu.addAction(self.zoomOutAct) + if self.zoomTextOnlyAct is not None: + menu.addAction(self.zoomTextOnlyAct) + menu.addSeparator() + menu.addAction(self.pageSourceAct) + menu.addAction(self.fullScreenAct) + + menu = mb.addMenu(self.trUtf8('&Go')) + menu.setTearOffEnabled(True) + menu.addAction(self.backAct) + menu.addAction(self.forwardAct) + menu.addAction(self.homeAct) + menu.addSeparator() + menu.addAction(self.stopAct) + menu.addAction(self.reloadAct) + menu.addSeparator() + menu.addAction(self.syncTocAct) + + self.historyMenu = HistoryMenu(self) + self.historyMenu.setTearOffEnabled(True) + self.historyMenu.setTitle(self.trUtf8('H&istory')) + self.connect(self.historyMenu, SIGNAL("openUrl(const QUrl&, const QString&)"), + self.__openUrl) + self.connect(self.historyMenu, SIGNAL("newUrl(const QUrl&, const QString&)"), + self.__openUrlNewTab) + mb.addMenu(self.historyMenu) + + self.bookmarksMenu = BookmarksMenuBarMenu(self) + self.bookmarksMenu.setTearOffEnabled(True) + self.bookmarksMenu.setTitle(self.trUtf8('&Bookmarks')) + self.connect(self.bookmarksMenu, SIGNAL("openUrl(const QUrl&, const QString&)"), + self.__openUrl) + self.connect(self.bookmarksMenu, SIGNAL("newUrl(const QUrl&, const QString&)"), + self.__openUrlNewTab) + mb.addMenu(self.bookmarksMenu) + + bookmarksActions = [] + bookmarksActions.append(self.bookmarksManageAct) + bookmarksActions.append(self.bookmarksAddAct) + bookmarksActions.append(self.bookmarksAllTabsAct) + bookmarksActions.append(self.bookmarksAddFolderAct) + self.bookmarksMenu.setInitialActions(bookmarksActions) + + menu = mb.addMenu(self.trUtf8('&Settings')) + menu.setTearOffEnabled(True) + menu.addAction(self.prefAct) + menu.addAction(self.acceptedLanguagesAct) + menu.addAction(self.cookiesAct) + menu.addSeparator() + menu.addAction(self.searchEnginesAct) + menu.addSeparator() + menu.addAction(self.passwordsAct) + menu.addSeparator() + menu.addAction(self.adblockAct) + menu.addSeparator() + menu.addAction(self.manageQtHelpDocsAct) + menu.addAction(self.manageQtHelpFiltersAct) + menu.addAction(self.reindexDocumentationAct) + menu.addSeparator() + menu.addAction(self.clearPrivateDataAct) + menu.addAction(self.clearIconsAct) + + menu = mb.addMenu(self.trUtf8("&Tools")) + menu.setTearOffEnabled(True) + menu.addAction(self.toolsMonitorAct) + + menu = mb.addMenu(self.trUtf8("&Window")) + menu.setTearOffEnabled(True) + menu.addAction(self.showTocAct) + menu.addAction(self.showIndexAct) + menu.addAction(self.showSearchAct) + + mb.addSeparator() + + menu = mb.addMenu(self.trUtf8('&Help')) + menu.setTearOffEnabled(True) + menu.addAction(self.aboutAct) + menu.addAction(self.aboutQtAct) + menu.addSeparator() + menu.addAction(self.whatsThisAct) + + def __initTabContextMenu(self): + """ + Private mezhod to create the tab context menu. + """ + self.__tabContextMenu = QMenu(self.tabWidget) + self.tabContextNewAct = \ + self.__tabContextMenu.addAction(self.newTabAct) + self.__tabContextMenu.addSeparator() + self.leftMenuAct = \ + self.__tabContextMenu.addAction(UI.PixmapCache.getIcon("1leftarrow.png"), + self.trUtf8('Move Left'), self.__tabContextMenuMoveLeft) + self.rightMenuAct = \ + self.__tabContextMenu.addAction(UI.PixmapCache.getIcon("1rightarrow.png"), + self.trUtf8('Move Right'), self.__tabContextMenuMoveRight) + self.__tabContextMenu.addSeparator() + self.tabContextCloneAct = \ + self.__tabContextMenu.addAction(self.trUtf8("Duplicate Page"), + self.__tabContextMenuClone) + self.__tabContextMenu.addSeparator() + self.tabContextCloseAct = \ + self.__tabContextMenu.addAction(UI.PixmapCache.getIcon("close.png"), + self.trUtf8('Close'), self.__tabContextMenuClose) + self.tabContextCloseOthersAct = \ + self.__tabContextMenu.addAction(self.trUtf8("Close Others"), + self.__tabContextMenuCloseOthers) + self.__tabContextMenu.addAction(self.closeAllAct) + self.__tabContextMenu.addSeparator() + self.__tabContextMenu.addAction(UI.PixmapCache.getIcon("printPreview.png"), + self.trUtf8('Print Preview'), self.__tabContextMenuPrintPreview) + self.__tabContextMenu.addAction(UI.PixmapCache.getIcon("print.png"), + self.trUtf8('Print'), self.__tabContextMenuPrint) + self.__tabContextMenu.addSeparator() + self.__tabContextMenu.addAction(self.bookmarksAllTabsAct) + + def __initToolbars(self): + """ + Private method to create the toolbars. + """ + filetb = self.addToolBar(self.trUtf8("File")) + filetb.setObjectName("FileToolBar") + filetb.setIconSize(UI.Config.ToolBarIconSize) + filetb.addAction(self.newTabAct) + filetb.addAction(self.newAct) + filetb.addAction(self.openAct) + filetb.addAction(self.openTabAct) + filetb.addSeparator() + filetb.addAction(self.saveAsAct) + filetb.addSeparator() + filetb.addAction(self.printPreviewAct) + filetb.addAction(self.printAct) + filetb.addSeparator() + filetb.addAction(self.closeAct) + filetb.addAction(self.exitAct) + + edittb = self.addToolBar(self.trUtf8("Edit")) + edittb.setObjectName("EditToolBar") + edittb.setIconSize(UI.Config.ToolBarIconSize) + edittb.addAction(self.copyAct) + + viewtb = self.addToolBar(self.trUtf8("View")) + viewtb.setObjectName("ViewToolBar") + viewtb.setIconSize(UI.Config.ToolBarIconSize) + viewtb.addAction(self.zoomInAct) + viewtb.addAction(self.zoomResetAct) + viewtb.addAction(self.zoomOutAct) + viewtb.addSeparator() + viewtb.addAction(self.fullScreenAct) + + findtb = self.addToolBar(self.trUtf8("Find")) + findtb.setObjectName("FindToolBar") + findtb.setIconSize(UI.Config.ToolBarIconSize) + findtb.addAction(self.findAct) + findtb.addAction(self.findNextAct) + findtb.addAction(self.findPrevAct) + + filtertb = self.addToolBar(self.trUtf8("Filter")) + filtertb.setObjectName("FilterToolBar") + self.filterCombo = QComboBox() + self.filterCombo.setMinimumWidth( + QFontMetrics(QFont()).width("ComboBoxWithEnoughWidth")) + filtertb.addWidget(QLabel(self.trUtf8("Filtered by: "))) + filtertb.addWidget(self.filterCombo) + self.connect(self.__helpEngine, SIGNAL("setupFinished()"), + self.__setupFilterCombo) + self.connect(self.filterCombo, SIGNAL("activated(const QString&)"), + self.__filterQtHelpDocumentation) + self.__setupFilterCombo() + + settingstb = self.addToolBar(self.trUtf8("Settings")) + settingstb.setObjectName("SettingsToolBar") + settingstb.setIconSize(UI.Config.ToolBarIconSize) + settingstb.addAction(self.prefAct) + settingstb.addAction(self.acceptedLanguagesAct) + settingstb.addAction(self.cookiesAct) + + helptb = self.addToolBar(self.trUtf8("Help")) + helptb.setObjectName("HelpToolBar") + helptb.setIconSize(UI.Config.ToolBarIconSize) + helptb.addAction(self.whatsThisAct) + + self.addToolBarBreak() + + gotb = self.addToolBar(self.trUtf8("Go")) + gotb.setObjectName("GoToolBar") + gotb.setIconSize(UI.Config.ToolBarIconSize) + gotb.addAction(self.backAct) + gotb.addAction(self.forwardAct) + gotb.addAction(self.reloadAct) + gotb.addAction(self.stopAct) + gotb.addAction(self.homeAct) + gotb.addSeparator() + + self.iconLabel = QLabel() + gotb.addWidget(self.iconLabel) + + self.pathCombo = QComboBox() + self.pathCombo.setDuplicatesEnabled(False) + self.pathCombo.setInsertPolicy(QComboBox.InsertAtTop) + self.pathCombo.setEditable(1) + self.pathCombo.setAutoCompletion(True) + self.connect(self.pathCombo, SIGNAL('activated(const QString&)'), + self.__pathSelected) + self.connect(self.pathCombo.lineEdit(), SIGNAL('returnPressed()'), + self.__pathEdited) + self.pathCombo.setWhatsThis(self.trUtf8( + """<p>Enter the help file to be displayed directly into this""" + """ edit field. Select a previously shown help file from the""" + """ drop down list.</p>""" + )) + sizePolicy = QSizePolicy(QSizePolicy.Expanding, QSizePolicy.Preferred) + sizePolicy.setHorizontalStretch(6) + sizePolicy.setVerticalStretch(0) + sizePolicy.setHeightForWidth(self.pathCombo.sizePolicy().hasHeightForWidth()) + self.pathCombo.setSizePolicy(sizePolicy) + gotb.addWidget(self.pathCombo) + self.pathComboDefaultColor = \ + self.pathCombo.lineEdit().palette().color(QPalette.Base) + self.__historyCompletionModel = HistoryCompletionModel(self) + self.__historyCompletionModel.setSourceModel( + self.historyManager().historyFilterModel()) + self.__historyCompleter = HistoryCompleter(self.__historyCompletionModel, self) + self.connect(self.__historyCompleter, SIGNAL("activated(const QString&)"), + self.__pathSelected) + self.pathCombo.setCompleter(self.__historyCompleter) + + self.privacyLabel = QLabel() + gotb.addWidget(self.privacyLabel) + + gotb.addSeparator() + self.searchEdit = HelpWebSearchWidget(self) + sizePolicy = QSizePolicy(QSizePolicy.Expanding, QSizePolicy.Preferred) + sizePolicy.setHorizontalStretch(2) + sizePolicy.setVerticalStretch(0) + sizePolicy.setHeightForWidth(self.searchEdit.sizePolicy().hasHeightForWidth()) + self.searchEdit.setSizePolicy(sizePolicy) + self.connect(self.searchEdit, SIGNAL("search"), self.__linkActivated) + gotb.addWidget(self.searchEdit) + + self.backMenu = QMenu(self) + self.connect(self.backMenu, SIGNAL("aboutToShow()"), self.__showBackMenu) + self.connect(self.backMenu, SIGNAL("triggered(QAction*)"), + self.__navigationMenuActionTriggered) + backButton = gotb.widgetForAction(self.backAct) + backButton.setMenu(self.backMenu) + backButton.setPopupMode(QToolButton.MenuButtonPopup) + + self.forwardMenu = QMenu(self) + self.connect(self.forwardMenu, SIGNAL("aboutToShow()"), self.__showForwardMenu) + self.connect(self.forwardMenu, SIGNAL("triggered(QAction*)"), + self.__navigationMenuActionTriggered) + forwardButton = gotb.widgetForAction(self.forwardAct) + forwardButton.setMenu(self.forwardMenu) + forwardButton.setPopupMode(QToolButton.MenuButtonPopup) + + bookmarksModel = self.bookmarksManager().bookmarksModel() + self.bookmarksToolBar = BookmarksToolBar(bookmarksModel) + self.bookmarksToolBar.setObjectName("BookmarksToolBar") + self.bookmarksToolBar.setIconSize(UI.Config.ToolBarIconSize) + self.connect(self.bookmarksToolBar, + SIGNAL("openUrl(const QUrl&, const QString&)"), + self.__openUrl) + self.connect(self.bookmarksToolBar, + SIGNAL("newUrl(const QUrl&, const QString&)"), + self.__openUrlNewTab) + self.addToolBarBreak() + self.addToolBar(self.bookmarksToolBar) + + def __nextTab(self): + """ + Private slot used to show the next tab. + """ + fwidget = QApplication.focusWidget() + while fwidget and not hasattr(fwidget, 'nextTab'): + fwidget = fwidget.parent() + if fwidget: + fwidget.nextTab() + + def __prevTab(self): + """ + Private slot used to show the previous tab. + """ + fwidget = QApplication.focusWidget() + while fwidget and not hasattr(fwidget, 'prevTab'): + fwidget = fwidget.parent() + if fwidget: + fwidget.prevTab() + + def __switchTab(self): + """ + Private slot used to switch between the current and the previous current tab. + """ + fwidget = QApplication.focusWidget() + while fwidget and not hasattr(fwidget, 'switchTab'): + fwidget = fwidget.parent() + if fwidget: + fwidget.switchTab() + + def __whatsThis(self): + """ + Private slot called in to enter Whats This mode. + """ + QWhatsThis.enterWhatsThisMode() + + def __showHistoryMenu(self): + """ + Private slot called in order to show the history menu. + """ + self.historyMenu.clear() + self.historyMenu.addAction(self.clearHistoryAct) + self.clearHistoryAct.setData(QVariant(-1)) + self.historyMenu.addSeparator() + idx = 0 + for hist in self.mHistory: + act = self.historyMenu.addAction( + Utilities.compactPath(unicode(hist), self.maxMenuFilePathLen)) + act.setData(QVariant(idx)) + idx += 1 + act.setIcon(HelpWindow.__getWebIcon(QUrl(hist))) + + def __pathEdited(self): + """ + Private slot called, when a URL has been entered. + """ + path = self.pathCombo.currentText() + self.__pathSelected(path) + + def __pathSelected(self, path): + """ + Private slot called when a file is selected in the combobox. + + @param path path to be shown (string) + """ + url = self.__guessUrlFromPath(path) + self.currentBrowser().setSource(url) + self.__setPathComboBackground() + + def __guessUrlFromPath(self, path): + """ + Private method to guess an URL given a path string. + + @param path path string to guess an URL for (string) + @return guessed URL (QUrl) + """ + manager = self.searchEdit.openSearchManager() + url = manager.convertKeywordSearchToUrl(path) + if url.isValid(): + return url + + return QUrl(path) + + def __setPathComboBackground(self): + """ + Private slot to change the path combo background to indicate save URLs. + """ + url = QUrl(self.pathCombo.currentText()) + le = self.pathCombo.lineEdit() + p = le.palette() + if url.isEmpty() or url.scheme() != "https": + p.setBrush(QPalette.Base, self.pathComboDefaultColor) + else: + p.setBrush(QPalette.Base, QBrush(Preferences.getHelp("SaveUrlColor"))) + le.setPalette(p) + le.update() + + def __elide(self, txt, mode = Qt.ElideRight, length = 40): + """ + Private method to elide some text. + + @param txt text to be elided (string) + @keyparam mode elide mode (Qt.TextElideMode) + @keyparam length amount of characters to be used (integer) + @return the elided text (string) + """ + if mode == Qt.ElideNone or len(txt) < length: + return txt + elif mode == Qt.ElideLeft: + return "...{0}".format(txt[-length:]) + elif mode == Qt.ElideMiddle: + return "{0}...{1}".format(txt[:length / 2], txt[-(length / 2):]) + elif mode == Qt.ElideRight: + return "{0}...".format(txt[:length]) + else: + # just in case + return txt + + def __sourceChanged(self, url): + """ + Private slot called when the displayed text of the combobox is changed. + + @param url URL of the new site (QUrl) + """ + selectedURL = url.toString() + if selectedURL and self.pathCombo: + i = self.pathCombo.findText(selectedURL) + if i == -1: + if not QWebSettings.globalSettings()\ + .testAttribute(QWebSettings.PrivateBrowsingEnabled): + self.pathCombo.insertItem(0, selectedURL) + self.pathCombo.setCurrentIndex(0) + else: + self.pathCombo.setCurrentIndex(i) + + self.__setPathComboBackground() + + self.iconChanged(self.currentBrowser().icon()) + + def __titleChanged(self, title): + """ + Private slot called to handle a change of the current browsers title. + + @param title new title (string) + """ + if title == "": + title = self.currentBrowser().url().toString() + + self.tabWidget.setTabText(self.tabWidget.currentIndex(), + self.__elide(title.replace("&", "&&"))) + self.tabWidget.setTabToolTip(self.tabWidget.currentIndex(), + title) + self.historyManager().updateHistoryEntry( + self.currentBrowser().url().toString(), title) + + def newTab(self, link = None): + """ + Public slot called to open a new help window tab. + + @param link file to be displayed in the new window (string or QUrl) + """ + if link is None: + linkName = "" + elif isinstance(link, QUrl): + linkName = link.toString() + else: + linkName = link + self.newBrowser(linkName) + + def newWindow(self, link = None): + """ + Public slot called to open a new help browser dialog. + + @param link file to be displayed in the new window (string or QUrl) + """ + if link is None: + linkName = "" + elif isinstance(link, QUrl): + linkName = link.toString() + else: + linkName = link + h = HelpWindow(linkName, ".", self.parent(), "qbrowser", self.fromEric) + h.show() + + def __openFile(self): + """ + Private slot called to open a file. + """ + fn = QFileDialog.getOpenFileName(\ + self, + self.trUtf8("Open File"), + "", + self.trUtf8("Help Files (*.html *.htm);;" + "PDF Files (*.pdf);;" + "CHM Files (*.chm);;" + "All Files (*)" + )) + if fn: + self.currentBrowser().setSource(QUrl("file://" + fn)) + + def __openFileNewTab(self): + """ + Private slot called to open a file in a new tab. + """ + fn = QFileDialog.getOpenFileName(\ + self, + self.trUtf8("Open File"), + "", + self.trUtf8("Help Files (*.html *.htm);;" + "PDF Files (*.pdf);;" + "CHM Files (*.chm);;" + "All Files (*)" + )) + if fn: + self.newTab("file://" + fn) + + def __savePageAs(self): + """ + Private slot to save the current page. + """ + browser = self.currentBrowser() + if browser is not None: + browser.saveAs() + + def __printFile(self, browser = None): + """ + Private slot called to print the displayed file. + + @param browser reference to the browser to be printed (HelpBrowserWV) + """ + if browser is None: + browser = self.currentBrowser() + + self.__printRequested(browser.page().mainFrame()) + + def __printRequested(self, frame): + """ + Private slot to handle a print request. + + @param frame reference to the frame to be printed (QWebFrame) + """ + printer = QPrinter(mode = QPrinter.HighResolution) + printer.setFullPage(1) + if Preferences.getPrinter("ColorMode"): + printer.setColorMode(QPrinter.Color) + else: + printer.setColorMode(QPrinter.GrayScale) + if Preferences.getPrinter("FirstPageFirst"): + printer.setPageOrder(QPrinter.FirstPageFirst) + else: + printer.setPageOrder(QPrinter.LastPageFirst) + printer.setPrinterName(Preferences.getPrinter("PrinterName")) + + printDialog = QPrintDialog(printer, self) + if browser.hasSelection(): + printDialog.addEnabledOption(QAbstractPrintDialog.PrintSelection) + if printDialog.exec_() == QDialog.Accepted: + try: + frame.print_(printer) + except AttributeError: + QMessageBox.critical(self, + self.trUtf8("Eric Web Browser"), + self.trUtf8("""<p>Printing is not available due to a bug in PyQt4.""" + """Please upgrade.</p>""")) + return + + def __printPreviewFile(self, browser = None): + """ + Private slot called to show a print preview of the displayed file. + + @param browser reference to the browser to be printed (HelpBrowserWV) + """ + from PyQt4.QtGui import QPrintPreviewDialog + + if browser is None: + browser = self.currentBrowser() + + printer = QPrinter(mode = QPrinter.HighResolution) + printer.setFullPage(1) + if Preferences.getPrinter("ColorMode"): + printer.setColorMode(QPrinter.Color) + else: + printer.setColorMode(QPrinter.GrayScale) + if Preferences.getPrinter("FirstPageFirst"): + printer.setPageOrder(QPrinter.FirstPageFirst) + else: + printer.setPageOrder(QPrinter.LastPageFirst) + printer.setPrinterName(Preferences.getPrinter("PrinterName")) + + self.__printPreviewBrowser = browser + preview = QPrintPreviewDialog(printer, self) + self.connect(preview, SIGNAL("paintRequested(QPrinter*)"), self.__printPreview) + preview.exec_() + + def __printPreview(self, printer): + """ + Public slot to generate a print preview. + + @param printer reference to the printer object (QPrinter) + """ + try: + self.__printPreviewBrowser.print_(printer) + except AttributeError: + QMessageBox.critical(self, + self.trUtf8("Eric Web Browser"), + self.trUtf8("""<p>Printing is not available due to a bug in PyQt4.""" + """Please upgrade.</p>""")) + return + + def __about(self): + """ + Private slot to show the about information. + """ + QMessageBox.about(self, self.trUtf8("Eric Web Browser"), self.trUtf8( + """<h3>About Eric Web Browser</h3>""" + """<p>The Eric Web Browser is a combined help file and HTML browser.</p>""" + )) + + def __aboutQt(self): + """ + Private slot to show info about Qt. + """ + QMessageBox.aboutQt(self, self.trUtf8("Eric Web Browser")) + + def __setBackwardAvailable(self, b): + """ + Private slot called when backward references are available. + + @param b flag indicating availability of the backwards action (boolean) + """ + self.backAct.setEnabled(b) + + def __setForwardAvailable(self, b): + """ + Private slot called when forward references are available. + + @param b flag indicating the availability of the forwards action (boolean) + """ + self.forwardAct.setEnabled(b) + + def __setLoadingActions(self, b): + """ + Private slot to set the loading dependent actions. + + @param b flag indicating the loading state to consider (boolean) + """ + self.reloadAct.setEnabled(not b) + self.stopAct.setEnabled(b) + + def __addBookmark(self): + """ + Private slot called to add the displayed file to the bookmarks. + """ + view = self.currentBrowser() + url = unicode(view.url().toEncoded()) + title = view.title() + + dlg = AddBookmarkDialog() + dlg.setUrl(url) + dlg.setTitle(title) + menu = self.bookmarksManager().menu() + idx = self.bookmarksManager().bookmarksModel().nodeIndex(menu) + dlg.setCurrentIndex(idx) + dlg.exec_() + + def __addBookmarkFolder(self): + """ + Private slot to add a new bookmarks folder. + """ + dlg = AddBookmarkDialog() + menu = self.bookmarksManager().menu() + idx = self.bookmarksManager().bookmarksModel().nodeIndex(menu) + dlg.setCurrentIndex(idx) + dlg.setFolder(True) + dlg.exec_() + + def __showBookmarksDialog(self): + """ + Private slot to show the bookmarks dialog. + """ + self.__bookmarksDialog = BookmarksDialog(self) + self.__bookmarksDialog.setAttribute(Qt.WA_DeleteOnClose) + self.connect(self.__bookmarksDialog, + SIGNAL("openUrl(const QUrl&, const QString&)"), + self.__openUrl) + self.connect(self.__bookmarksDialog, + SIGNAL("newUrl(const QUrl&, const QString&)"), + self.__openUrlNewTab) + self.__bookmarksDialog.show() + + def __bookmarkAll(self): + """ + Private slot to bookmark all open tabs. + """ + dlg = AddBookmarkDialog() + dlg.setFolder(True) + dlg.setTitle(self.trUtf8("Saved Tabs")) + dlg.exec_() + + folder = dlg.addedNode() + if folder is None: + return + + for index in range(self.tabWidget.count()): + tab = self.tabWidget.widget(index) + if tab is None: + continue + + bookmark = BookmarkNode(BookmarkNode.Bookmark) + bookmark.url = unicode(tab.url().toEncoded()) + bookmark.title = tab.title() + + self.bookmarksManager().addBookmark(folder, bookmark) + + def __find(self): + """ + Private slot to handle the find action. + + It opens the search dialog in order to perform the various + search actions and to collect the various search info. + """ + self.findDlg.showFind() + + def closeEvent(self, e): + """ + Private event handler for the close event. + + @param e the close event (QCloseEvent) + <br />This event is simply accepted after the history has been + saved and all window references have been deleted. + """ + self.__closeNetworkMonitor() + + self.cookieJar().close() + + self.bookmarksManager().close() + + self.historyManager().close() + + self.passwordManager().close() + + self.adblockManager().close() + + self.searchEdit.openSearchManager().close() + + self.__searchEngine.cancelIndexing() + self.__searchEngine.cancelSearching() + + if self.__helpInstaller: + self.__helpInstaller.stop() + + self.searchEdit.saveSearches() + + state = self.saveState() + Preferences.setHelp("HelpViewerState", state) + + if Preferences.getHelp("SaveGeometry"): + if not self.__isFullScreen(): + Preferences.setGeometry("HelpViewerGeometry", self.saveGeometry()) + else: + Preferences.setGeometry("HelpViewerGeometry", QByteArray()) + + try: + del self.__class__.helpwindows[self.__class__.helpwindows.index(self)] + except ValueError: + pass + + if not self.fromEric: + Preferences.syncPreferences() + + e.accept() + self.emit(SIGNAL("helpClosed")) + + def __backward(self): + """ + Private slot called to handle the backward action. + """ + self.currentBrowser().backward() + + def __forward(self): + """ + Private slot called to handle the forward action. + """ + self.currentBrowser().forward() + + def __home(self): + """ + Private slot called to handle the home action. + """ + self.currentBrowser().home() + + def __reload(self): + """ + Private slot called to handle the reload action. + """ + self.currentBrowser().reload() + + def __stopLoading(self): + """ + Private slot called to handle loading of the current page. + """ + self.currentBrowser().stop() + + def __zoomIn(self): + """ + Private slot called to handle the zoom in action. + """ + self.currentBrowser().zoomIn() + + def __zoomOut(self): + """ + Private slot called to handle the zoom out action. + """ + self.currentBrowser().zoomOut() + + def __zoomReset(self): + """ + Private slot called to handle the zoom reset action. + """ + self.currentBrowser().zoomReset() + + def __zoomTextOnly(self, textOnly): + """ + Private slot called to handle the zoom text only action. + + @param textOnly flag indicating to zoom text only (boolean) + """ + QWebSettings.globalSettings().setAttribute(QWebSettings.ZoomTextOnly, textOnly) + self.emit(SIGNAL("zoomTextOnlyChanged(bool)"), textOnly) + + def __viewFullScreen(self,): + """ + Private slot called to toggle fullscreen mode. + """ + if self.__isFullScreen(): + # switch back to normal + self.setWindowState(self.windowState() & ~Qt.WindowFullScreen) + self.menuBar().show() + self.fullScreenAct.setIcon(UI.PixmapCache.getIcon("windowFullscreen.png")) + else: + # switch to full screen + self.setWindowState(self.windowState() | Qt.WindowFullScreen) + self.menuBar().hide() + self.fullScreenAct.setIcon(UI.PixmapCache.getIcon("windowRestore.png")) + + def __isFullScreen(self): + """ + Private method to determine, if the window is in full screen mode. + + @return flag indicating full screen mode (boolean) + """ + return self.windowState() & Qt.WindowFullScreen + + def __copy(self): + """ + Private slot called to handle the copy action. + """ + self.currentBrowser().copy() + + def __close(self): + """ + Private slot called to handle the close action. + """ + browser = self.currentBrowser() + self.tabWidget.removeTab(self.tabWidget.currentIndex()) + del browser + if self.tabWidget.count() == 0: + self.newTab() + else: + self.__currentChanged(self.tabWidget.currentIndex()) + + def __closeAll(self): + """ + Private slot called to handle the close all action. + """ + for index in range(self.tabWidget.count() - 1, -1, -1): + self.__closeAt(index) + + def __closeAt(self, index): + """ + Private slot to close a window based on it's index. + + @param index index of window to close (integer) + """ + browser = self.tabWidget.widget(index) + self.tabWidget.removeTab(index) + del browser + if self.tabWidget.count() == 0: + self.newTab() + else: + self.__currentChanged(self.tabWidget.currentIndex()) + + def __windowCloseRequested(self): + """ + Private slot to handle the windowCloseRequested signal of a browser. + """ + page = self.sender() + if page is None: + return + + browser = page.view() + if browser is None: + return + + index = self.tabWidget.indexOf(browser) + self.tabWidget.removeTab(index) + del browser + if self.tabWidget.count() == 0: + self.newTab() + else: + self.__currentChanged(self.tabWidget.currentIndex()) + + def __privateBrowsing(self): + """ + Private slot to switch private browsing. + """ + settings = QWebSettings.globalSettings() + pb = settings.testAttribute(QWebSettings.PrivateBrowsingEnabled) + if not pb: + txt = self.trUtf8("""<b>Are you sure you want to turn on private""" + """ browsing?</b><p>When private browsing is turned on,""" + """ web pages are not added to the history, searches""" + """ are not added to the list of recent searches and""" + """ web site icons and cookies are not stored.""" + """ Until you close the window, you can still click""" + """ the Back and Forward buttons to return to the""" + """ web pages you have opened.</p>""") + res = QMessageBox.question(self, "", txt, + QMessageBox.StandardButtons(\ + QMessageBox.Cancel | \ + QMessageBox.Ok), + QMessageBox.Ok) + if res == QMessageBox.Ok: + settings.setAttribute(QWebSettings.PrivateBrowsingEnabled, True) + self.pathCombo.setInsertPolicy(QComboBox.NoInsert) + self.privacyLabel.setPixmap( + UI.PixmapCache.getPixmap("privateBrowsing.png")) + self.__setIconDatabasePath(False) + else: + settings.setAttribute(QWebSettings.PrivateBrowsingEnabled, False) + self.pathCombo.setInsertPolicy(QComboBox.InsertAtTop) + self.privacyLabel.setPixmap(QPixmap()) + self.__setIconDatabasePath(True) + + def currentBrowser(self): + """ + Public method to get a reference to the current help browser. + + @return reference to the current help browser (HelpBrowser) + """ + return self.tabWidget.currentWidget() + + def browsers(self): + """ + Public method to get a list of references to all help browsers. + + @return list of references to help browsers (list of HelpBrowser) + """ + l = [] + for index in range(self.tabWidget.count()): + l.append(self.tabWidget.widget(index)) + return l + + def newBrowser(self, link): + """ + Public method to create a new help browser tab. + + @param link link to be shown (string) + """ + browser = HelpBrowser(self) + + self.connect(browser, SIGNAL('sourceChanged(const QUrl &)'), + self.__sourceChanged) + self.connect(browser, SIGNAL("titleChanged(const QString&)"), self.__titleChanged) + + index = self.tabWidget.addTab(browser, self.trUtf8("...")) + self.tabWidget.setCurrentIndex(index) + + if not link and Preferences.getHelp("StartupBehavior") == 0: + link = Preferences.getHelp("HomePage") + + if link: + browser.setSource(QUrl(link)) + if not browser.documentTitle(): + self.tabWidget.setTabText(index, self.__elide(link, Qt.ElideMiddle)) + self.tabWidget.setTabToolTip(index, link) + else: + self.tabWidget.setTabText(index, + self.__elide(browser.documentTitle().replace("&", "&&"))) + self.tabWidget.setTabToolTip(index, browser.documentTitle()) + + self.connect(browser, SIGNAL('highlighted(const QString&)'), + self.statusBar(), SLOT('showMessage(const QString&)')) + self.connect(browser, SIGNAL('backwardAvailable(bool)'), + self.__setBackwardAvailable) + self.connect(browser, SIGNAL('forwardAvailable(bool)'), + self.__setForwardAvailable) + self.connect(browser.page(), SIGNAL('windowCloseRequested()'), + self.__windowCloseRequested) + self.connect(browser.page(), SIGNAL('printRequested(QWebFrame*)'), + self.__printRequested) + self.connect(browser, SIGNAL("search(const QUrl &)"), + self.newTab) + + self.closeAct.setEnabled(True) + self.closeAllAct.setEnabled(True) + self.closeButton and self.closeButton.setEnabled(True) + self.navigationButton.setEnabled(True) + + def __currentChanged(self, index): + """ + Private slot to handle the currentChanged signal. + + @param index index of the current tab (integer) + """ + if index > -1: + cb = self.currentBrowser() + if cb is not None: + self.__setForwardAvailable(cb.isForwardAvailable()) + self.__setBackwardAvailable(cb.isBackwardAvailable()) + self.__setLoadingActions(cb.isLoading()) + + url = cb.source().toString() + index2 = self.pathCombo.findText(url) + if index2 > -1: + self.pathCombo.setCurrentIndex(index2) + else: + self.pathCombo.clearEditText() + + self.__setPathComboBackground() + + self.printAct.setEnabled(hasattr(cb, 'print_')) + if self.printPreviewAct: + self.printPreviewAct.setEnabled(hasattr(cb, 'print_')) + + self.iconChanged(cb.icon()) + + def __showContextMenu(self, coord, index): + """ + Private slot to show the tab context menu. + + @param coord the position of the mouse pointer (QPoint) + @param index index of the tab the menu is requested for (integer) + """ + self.tabContextMenuIndex = index + self.leftMenuAct.setEnabled(index > 0) + self.rightMenuAct.setEnabled(index < self.tabWidget.count() - 1) + + self.tabContextCloseOthersAct.setEnabled(self.tabWidget.count() > 1) + + coord = self.tabWidget.mapToGlobal(coord) + self.__tabContextMenu.popup(coord) + + def __tabContextMenuMoveLeft(self): + """ + Private method to move a tab one position to the left. + """ + self.tabWidget.moveTab(self.tabContextMenuIndex, self.tabContextMenuIndex - 1) + + def __tabContextMenuMoveRight(self): + """ + Private method to move a tab one position to the right. + """ + self.tabWidget.moveTab(self.tabContextMenuIndex, self.tabContextMenuIndex + 1) + + def __tabContextMenuClone(self): + """ + Private method to clone the selected tab. + """ + idx = self.tabContextMenuIndex + if idx < 0: + idx = self.tabWidget.currentIndex() + if idx < 0 or idx > self.tabWidget.count(): + return + + self.newTab(self.tabWidget.widget(idx).url()) + + def __tabContextMenuClose(self): + """ + Private method to close the selected tab. + """ + self.__closeAt(self.tabContextMenuIndex) + + def __tabContextMenuCloseOthers(self): + """ + Private slot to close all other tabs. + """ + index = self.tabContextMenuIndex + for i in range(self.tabWidget.count() - 1, index, -1) + range(index - 1, -1, -1): + self.__closeAt(i) + + def __tabContextMenuPrint(self): + """ + Private method to print the selected tab. + """ + browser = self.tabWidget.widget(self.tabContextMenuIndex) + self.__printFile(browser) + + def __tabContextMenuPrintPreview(self): + """ + Private method to show a print preview of the selected tab. + """ + browser = self.tabWidget.widget(self.tabContextMenuIndex) + self.__printPreviewFile(browser) + + def __showPreferences(self): + """ + Private slot to set the preferences. + """ + dlg = ConfigurationDialog(self, 'Configuration', True, + fromEric = self.fromEric, + helpBrowserMode = True) + self.connect(dlg, SIGNAL('preferencesChanged'), + self.preferencesChanged) + dlg.show() + dlg.showConfigurationPageByName("empty") + dlg.exec_() + QApplication.processEvents() + if dlg.result() == QDialog.Accepted: + dlg.setPreferences() + Preferences.syncPreferences() + self.preferencesChanged() + + def preferencesChanged(self): + """ + Public slot to handle a change of preferences. + """ + self.__setPathComboBackground() + + self.__initWebSettings() + + self.networkAccessManager().preferencesChanged() + + self.historyManager().preferencesChanged() + + for index in range(self.tabWidget.count()): + self.tabWidget.widget(index).preferencesChanged() + + self.searchEdit.preferencesChanged() + + def __showAcceptedLanguages(self): + """ + Private slot to configure the accepted languages for web pages. + """ + dlg = HelpLanguagesDialog(self) + dlg.exec_() + self.networkAccessManager().languagesChanged() + + def __showCookiesConfiguration(self): + """ + Private slot to configure the cookies handling. + """ + dlg = CookiesConfigurationDialog(self) + dlg.exec_() + + def setLoading(self, widget): + """ + Public method to set the loading icon. + + @param widget reference to the widget to set the icon for (QWidget) + """ + index = self.tabWidget.indexOf(widget) + anim = self.tabWidget.animationLabel( + index, os.path.join(getConfig("ericPixDir"), "loading.gif")) + if not anim: + loading = QIcon(os.path.join(getConfig("ericPixDir"), "loading.gif")) + self.tabWidget.setTabIcon(index, loading) + self.statusBar().showMessage(self.trUtf8("Loading...")) + + self.__setLoadingActions(True) + + def resetLoading(self, widget): + """ + Public method to reset the loading icon. + + @param widget reference to the widget to reset the icon for (QWidget) + """ + index = self.tabWidget.indexOf(widget) + self.tabWidget.resetAnimation(index) + self.tabWidget.setTabIcon(index, widget.icon()) + self.statusBar().showMessage(self.trUtf8("Finished loading")) + + self.__setLoadingActions(False) + + ############################################################################ + ## Methods to support Webkit based browser below. + ############################################################################ + + def progressBar(self): + """ + Public method to get a reference to the load progress bar. + + @return reference to the load progress bar (QProgressBar) + """ + if self.__progressBar is None: + self.__progressBar = QProgressBar() + self.statusBar().addPermanentWidget(self.__progressBar) + self.__progressBar.setMaximumWidth(100) + self.__progressBar.setFixedHeight(16) + self.__progressBar.setSizePolicy(QSizePolicy.Minimum, QSizePolicy.Fixed) + self.__progressBar.hide() + + return self.__progressBar + + @classmethod + def helpEngine(cls): + """ + Class method to get a reference to the help engine. + + @return reference to the help engine (QHelpEngine) + """ + if cls._helpEngine is None: + cls._helpEngine = \ + QHelpEngine(os.path.join(Utilities.getConfigDir(), + "browser", "eric4help.qhc")) + return cls._helpEngine + + @classmethod + def networkAccessManager(cls): + """ + Class method to get a reference to the network access manager. + + @return reference to the network access manager (NetworkAccessManager) + """ + if cls._networkAccessManager is None: + cls._networkAccessManager = \ + NetworkAccessManager(cls.helpEngine()) + cls._cookieJar = CookieJar() + cls._networkAccessManager.setCookieJar(cls._cookieJar) + + return cls._networkAccessManager + + @classmethod + def cookieJar(cls): + """ + Class method to get a reference to the cookie jar. + + @return reference to the cookie jar (CookieJar) + """ + return cls.networkAccessManager().cookieJar() + + def iconChanged(self, icon): + """ + Public slot to change the icon shown to the left of the URL entry. + + @param icon icon to be shown (QIcon) + """ + self.tabWidget.setTabIcon(self.tabWidget.currentIndex(), icon) + self.iconLabel.setPixmap(icon.pixmap(16, 16)) + + def __clearIconsDatabase(self): + """ + Private slot to clear the icons databse. + """ + QWebSettings.clearIconDatabase() + + @pyqtSlot(QUrl) + def __linkActivated(self, url): + """ + Private slot to handle the selection of a link in the TOC window. + + @param url URL to be shown (QUrl) + """ + self.currentBrowser().setSource(url) + + def __linksActivated(self, links, keyword): + """ + Private slot to select a topic to be shown. + + @param links dictionary with help topic as key (string) and + URL as value (QUrl) + @param keyword keyword for the link set (string) + """ + dlg = HelpTopicDialog(self, keyword, links) + if dlg.exec_() == QDialog.Accepted: + self.currentBrowser().setSource(dlg.link()) + + def __activateCurrentBrowser(self): + """ + Private slot to activate the current browser. + """ + self.currentBrowser().setFocus() + + def __syncTOC(self): + """ + Private slot to synchronize the TOC with the currently shown page. + """ + QApplication.setOverrideCursor(Qt.WaitCursor) + url = self.currentBrowser().source() + self.__showTocWindow() + if not self.__tocWindow.syncToContent(url): + self.statusBar().showMessage( + self.trUtf8("Could not find an associated content."), 5000) + QApplication.restoreOverrideCursor() + + def __showTocWindow(self): + """ + Private method to show the table of contents window. + """ + self.__activateDock(self.__tocWindow) + + def __hideTocWindow(self): + """ + Private method to hide the table of contents window. + """ + self.__tocDock.hide() + + def __showIndexWindow(self): + """ + Private method to show the index window. + """ + self.__activateDock(self.__indexWindow) + + def __hideIndexWindow(self): + """ + Private method to hide the index window. + """ + self.__indexDock.hide() + + def __showSearchWindow(self): + """ + Private method to show the search window. + """ + self.__activateDock(self.__searchWindow) + + def __hideSearchWindow(self): + """ + Private method to hide the search window. + """ + self.__searchDock.hide() + + def __activateDock(self, widget): + """ + Private method to activate the dock widget of the given widget. + + @param widget reference to the widget to be activated (QWidget) + """ + widget.parent().show() + widget.parent().raise_() + widget.setFocus() + + def __setupFilterCombo(self): + """ + Private slot to setup the filter combo box. + """ + curFilter = self.filterCombo.currentText() + if not curFilter: + curFilter = self.__helpEngine.currentFilter() + self.filterCombo.clear() + self.filterCombo.addItems(self.__helpEngine.customFilters()) + idx = self.filterCombo.findText(curFilter) + if idx < 0: + idx = 0 + self.filterCombo.setCurrentIndex(idx) + + def __filterQtHelpDocumentation(self, customFilter): + """ + Private slot to filter the QtHelp documentation. + + @param customFilter name of filter to be applied (QString) + """ + self.__helpEngine.setCurrentFilter(customFilter) + + def __manageQtHelpDocumentation(self): + """ + Private slot to manage the QtHelp documentation database. + """ + dlg = QtHelpDocumentationDialog(self.__helpEngine, self) + dlg.exec_() + if dlg.hasChanges(): + for i in sorted(dlg.getTabsToClose(), reverse = True): + self.__closeAt(i) + self.__helpEngine.setupData() + + def getSourceFileList(self): + """ + Public method to get a list of all opened source files. + + @return dictionary with tab id as key and host/namespace as value + """ + sourceList = {} + for i in range(self.tabWidget.count()): + viewer = self.tabWidget.widget(i) + if viewer is not None and \ + viewer.source().isValid(): + sourceList[i] = viewer.source().host() + + return sourceList + + def __manageQtHelpFilters(self): + """ + Private slot to manage the QtHelp filters. + """ + dlg = QtHelpFiltersDialog(self.__helpEngine, self) + dlg.exec_() + + def __indexingStarted(self): + """ + Private slot to handle the start of the indexing process. + """ + self.__indexing = True + if self.__indexingProgress is None: + self.__indexingProgress = QWidget() + layout = QHBoxLayout(self.__indexingProgress) + layout.setMargin(0) + sizePolicy = QSizePolicy(QSizePolicy.Preferred, QSizePolicy.Maximum) + + label = QLabel(self.trUtf8("Updating search index")) + label.setSizePolicy(sizePolicy) + layout.addWidget(label) + + progressBar = QProgressBar() + progressBar.setRange(0, 0) + progressBar.setTextVisible(False) + progressBar.setFixedHeight(16) + progressBar.setSizePolicy(sizePolicy) + layout.addWidget(progressBar) + + self.statusBar().addPermanentWidget(self.__indexingProgress) + + def __indexingFinished(self): + """ + Private slot to handle the start of the indexing process. + """ + self.statusBar().removeWidget(self.__indexingProgress) + self.__indexingProgress = None + self.__indexing = False + if self.__searchWord is not None: + self.__searchForWord() + + def __searchForWord(self): + """ + Private slot to search for a word. + """ + if not self.__indexing and self.__searchWord is not None: + self.__searchDock.show() + self.__searchDock.raise_() + query = QHelpSearchQuery(QHelpSearchQuery.DEFAULT, [self.__searchWord]) + self.__searchEngine.search([query]) + self.__searchWord = None + + def search(self, word): + """ + Public method to search for a word. + + @param word word to search for (string) + """ + self.__searchWord = word + self.__searchForWord() + + def __lookForNewDocumentation(self): + """ + Private slot to look for new documentation to be loaded into the + help database. + """ + self.__helpInstaller = HelpDocsInstaller(self.__helpEngine.collectionFile()) + self.connect(self.__helpInstaller, SIGNAL("errorMessage(const QString&)"), + self.__showInstallationError) + self.connect(self.__helpInstaller, SIGNAL("docsInstalled(bool)"), + self.__docsInstalled) + + self.statusBar().showMessage(self.trUtf8("Looking for Documentation...")) + self.__helpInstaller.installDocs() + + def __showInstallationError(self, message): + """ + Private slot to show installation errors. + + @param message message to be shown (QString) + """ + QMessageBox.warning(self, + self.trUtf8("eric4 Web Browser"), + message) + + def __docsInstalled(self, installed): + """ + Private slot handling the end of documentation installation. + + @param installed flag indicating that documents were installed (boolean) + """ + if installed: + self.__helpEngine.setupData() + self.statusBar().clearMessage() + + def __initHelpDb(self): + """ + Private slot to initialize the documentation database. + """ + if not self.__helpEngine.setupData(): + return + + unfiltered = self.trUtf8("Unfiltered") + if unfiltered not in self.__helpEngine.customFilters(): + hc = QHelpEngineCore(self.__helpEngine.collectionFile()) + hc.setupData() + hc.addCustomFilter(unfiltered, []) + hc = None + del hc + + self.__helpEngine.blockSignals(True) + self.__helpEngine.setCurrentFilter(unfiltered) + self.__helpEngine.blockSignals(False) + self.__helpEngine.setupData() + + def __warning(self, msg): + """ + Private slot handling warnings from the help engine. + + @param msg message sent by the help engine (QString) + """ + QMessageBox.warning(self, + self.trUtf8("Help Engine"), msg) + + def __showNavigationMenu(self): + """ + Private slot to show the navigation button menu. + """ + self.__navigationMenu.clear() + for index in range(self.tabWidget.count()): + act = self.__navigationMenu.addAction(self.tabWidget.tabIcon(index), + self.tabWidget.tabText(index)) + act.setData(QVariant(index)) + + def __navigationMenuTriggered(self, act): + """ + Private slot called to handle the navigation button menu selection. + + @param act reference to the selected action (QAction) + """ + index, ok = act.data().toInt() + if ok: + self.tabWidget.setCurrentIndex(index) + + def __showBackMenu(self): + """ + Private slot showing the backwards navigation menu. + """ + self.backMenu.clear() + history = self.currentBrowser().history() + historyCount = history.count() + backItems = history.backItems(historyCount) + for index in range(len(backItems) - 1, -1, -1): + item = backItems[index] + act = QAction(self) + act.setData(QVariant(-1 * (index + 1))) + icon = HelpWindow.__getWebIcon(item.url()) + act.setIcon(icon) + act.setText(item.title()) + self.backMenu.addAction(act) + + def __showForwardMenu(self): + """ + Private slot showing the forwards navigation menu. + """ + self.forwardMenu.clear() + history = self.currentBrowser().history() + historyCount = history.count() + forwardItems = history.forwardItems(historyCount) + for index in range(len(forwardItems)): + item = forwardItems[index] + act = QAction(self) + act.setData(QVariant(index + 1)) + icon = HelpWindow.__getWebIcon(item.url()) + act.setIcon(icon) + act.setText(item.title()) + self.forwardMenu.addAction(act) + + def __navigationMenuActionTriggered(self, act): + """ + Private slot to go to the selected page. + + @param act reference to the action selected in the navigation menu (QAction) + """ + offset = act.data().toInt()[0] + history = self.currentBrowser().history() + historyCount = history.count() + if offset < 0: + # go back + history.goToItem(history.backItems(historyCount)[-1 * offset - 1]) + else: + # go forward + history.goToItem(history.forwardItems(historyCount)[offset - 1]) + + def __clearPrivateData(self): + """ + Private slot to clear the private data. + """ + dlg = HelpClearPrivateDataDialog(self) + if dlg.exec_() == QDialog.Accepted: + history, searches, favicons, cache, cookies, passwords = dlg.getData() + # browsing history, search history, favicons, disk cache, cookies, passwords + if history: + self.historyManager().clear() + if searches: + self.searchEdit.clear() + if favicons: + self.__clearIconsDatabase() + if cache: + try: + self.networkAccessManager().cache().clear() + except AttributeError: + pass + if cookies: + self.cookieJar().clear() + if passwords: + self.passwordManager().clear() + + def __showEnginesConfigurationDialog(self): + """ + Private slot to show the search engines configuration dialog. + """ + from OpenSearch.OpenSearchDialog import OpenSearchDialog + + dlg = OpenSearchDialog(self) + dlg.exec_() + + def searchEnginesAction(self): + """ + Public method to get a reference to the search engines configuration action. + + @return reference to the search engines configuration action (QAction) + """ + return self.searchEnginesAct + + def __showPasswordsDialog(self): + """ + Private slot to show the passwords management dialog. + """ + from Passwords.PasswordsDialog import PasswordsDialog + + dlg = PasswordsDialog(self) + dlg.exec_() + + def __showAdBlockDialog(self): + """ + Private slot to show the AdBlock configuration dialog. + """ + self.adblockManager().showDialog() + + def __showNetworkMonitor(self): + """ + Private slot to show the network monitor dialog. + """ + monitor = E4NetworkMonitor.instance(self.networkAccessManager()) + monitor.show() + + def __closeNetworkMonitor(self): + """ + Private slot to close the network monitor dialog. + """ + E4NetworkMonitor.closeMonitor() + + def __showPageSource(self): + """ + Private slot to show the source of the current page in an editor. + """ + from QScintilla.MiniEditor import MiniEditor + src = self.currentBrowser().page().mainFrame().toHtml() + editor = MiniEditor(parent = self) + editor.setText(src, "Html") + editor.setLanguage("dummy.html") + editor.show() + + @classmethod + def icon(cls, url): + """ + Class method to get the icon for an URL. + + @param url URL to get icon for (QUrl) + @return icon for the URL (QIcon) + """ + icon = HelpWindow.__getWebIcon(url) + + if icon.isNull(): + pixmap = QWebSettings.webGraphic(QWebSettings.DefaultFrameIconGraphic) + if pixmap.isNull(): + pixmap = UI.PixmapCache.getPixmap("defaultIcon.png") + QWebSettings.setWebGraphic(QWebSettings.DefaultFrameIconGraphic, pixmap) + return QIcon(pixmap) + + return icon + + @staticmethod + def __getWebIcon(url): + """ + Private static method to fetch the icon for a URL. + + @param url URL to get icon for (QUrl) + @return icon for the URL (QIcon) + """ + icon = QWebSettings.iconForUrl(url) + if icon.isNull(): + # try again + QThread.usleep(10) + icon = QWebSettings.iconForUrl(url) + if not icon.isNull(): + icon = QIcon(icon.pixmap(22, 22)) + return icon + + @classmethod + def bookmarksManager(cls): + """ + Class method to get a reference to the bookmarks manager. + + @return reference to the bookmarks manager (BookmarksManager) + """ + if cls._bookmarksManager is None: + cls._bookmarksManager = BookmarksManager() + + return cls._bookmarksManager + + def __openUrl(self, url, title): + """ + Private slot to load a URL from the bookmarks menu or bookmarks toolbar + in the current tab. + + @param url url to be opened (QUrl) + @param title title of the bookmark (string) + """ + self.__linkActivated(url) + + def __openUrlNewTab(self, url, title): + """ + Private slot to load a URL from the bookmarks menu or bookmarks toolbar + in a new tab. + + @param url url to be opened (QUrl) + @param title title of the bookmark (string) + """ + self.newTab(url) + + @classmethod + def historyManager(cls): + """ + Class method to get a reference to the history manager. + + @return reference to the history manager (HistoryManager) + """ + if cls._historyManager is None: + cls._historyManager = HistoryManager() + + return cls._historyManager + + @classmethod + def passwordManager(cls): + """ + Class method to get a reference to the password manager. + + @return reference to the password manager (PasswordManager) + """ + if cls._passwordManager is None: + cls._passwordManager = PasswordManager() + + return cls._passwordManager + + @classmethod + def adblockManager(cls): + """ + Class method to get a reference to the AdBlock manager. + + @return reference to the AdBlock manager (AdBlockManager) + """ + if cls._adblockManager is None: + cls._adblockManager = AdBlockManager() + + return cls._adblockManager