PageRenderTime 55ms CodeModel.GetById 21ms RepoModel.GetById 0ms app.codeStats 0ms

/src/app/qupzilla.cpp

https://github.com/JHooverman/QupZilla
C++ | 1664 lines | 1388 code | 235 blank | 41 comment | 151 complexity | 8a0dddfe95a75ff6339e9946d2a3dbf8 MD5 | raw file
Possible License(s): BSD-3-Clause, MPL-2.0-no-copyleft-exception

Large files files are truncated, but you can click here to view the full file

  1. /* ============================================================
  2. * QupZilla - WebKit based browser
  3. * Copyright (C) 2010-2012 David Rosca <nowrep@gmail.com>
  4. *
  5. * This program is free software: you can redistribute it and/or modify
  6. * it under the terms of the GNU General Public License as published by
  7. * the Free Software Foundation, either version 3 of the License, or
  8. * (at your option) any later version.
  9. *
  10. * This program is distributed in the hope that it will be useful,
  11. * but WITHOUT ANY WARRANTY; without even the implied warranty of
  12. * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
  13. * GNU General Public License for more details.
  14. *
  15. * You should have received a copy of the GNU General Public License
  16. * along with this program. If not, see <http://www.gnu.org/licenses/>.
  17. * ============================================================ */
  18. #include "qupzilla.h"
  19. #include "tabwidget.h"
  20. #include "tabbar.h"
  21. #include "webpage.h"
  22. #include "tabbedwebview.h"
  23. #include "lineedit.h"
  24. #include "historymodel.h"
  25. #include "locationbar.h"
  26. #include "searchtoolbar.h"
  27. #include "websearchbar.h"
  28. #include "downloadmanager.h"
  29. #include "cookiejar.h"
  30. #include "cookiemanager.h"
  31. #include "bookmarksmanager.h"
  32. #include "bookmarkstoolbar.h"
  33. #include "clearprivatedata.h"
  34. #include "sourceviewer.h"
  35. #include "siteinfo.h"
  36. #include "preferences.h"
  37. #include "networkmanager.h"
  38. #include "autofillmodel.h"
  39. #include "networkmanagerproxy.h"
  40. #include "rssmanager.h"
  41. #include "mainapplication.h"
  42. #include "aboutdialog.h"
  43. #include "pluginproxy.h"
  44. #include "qtwin.h"
  45. #include "ui_closedialog.h"
  46. #include "adblockmanager.h"
  47. #include "clickablelabel.h"
  48. #include "docktitlebarwidget.h"
  49. #include "sidebar.h"
  50. #include "iconprovider.h"
  51. #include "progressbar.h"
  52. #include "adblockicon.h"
  53. #include "closedtabsmanager.h"
  54. #include "statusbarmessage.h"
  55. #include "locationbarsettings.h"
  56. #include "browsinglibrary.h"
  57. #include "navigationbar.h"
  58. #include "pagescreen.h"
  59. #include "webinspectordockwidget.h"
  60. #include "bookmarksimportdialog.h"
  61. #include "globalfunctions.h"
  62. #include "webhistorywrapper.h"
  63. #include "enhancedmenu.h"
  64. #include "settings.h"
  65. #include "webtab.h"
  66. const QString QupZilla::VERSION = "1.1.5";
  67. const QString QupZilla::BUILDTIME = __DATE__" "__TIME__;
  68. const QString QupZilla::AUTHOR = "David Rosca";
  69. const QString QupZilla::COPYRIGHT = "2010-2012";
  70. const QString QupZilla::WWWADDRESS = "http://www.qupzilla.com";
  71. const QString QupZilla::WIKIADDRESS = "https://github.com/nowrep/QupZilla/wiki";
  72. const QString QupZilla::WEBKITVERSION = qWebKitVersion();
  73. const QIcon QupZilla::qupzillaIcon()
  74. {
  75. QIcon i;
  76. i.addFile(":icons/exeicons/qupzilla16.png");
  77. i.addFile(":icons/exeicons/qupzilla32.png");
  78. i.addFile(":icons/exeicons/qupzilla48.png");
  79. i.addFile(":icons/exeicons/qupzilla64.png");
  80. i.addFile(":icons/exeicons/qupzilla128.png");
  81. i.addFile(":icons/exeicons/qupzilla256.png");
  82. return i;
  83. }
  84. QupZilla::QupZilla(Qz::BrowserWindow type, QUrl startUrl)
  85. : QMainWindow(0)
  86. , m_historyMenuChanged(true)
  87. , m_bookmarksMenuChanged(true)
  88. , m_isClosing(false)
  89. , m_startingUrl(startUrl)
  90. , m_startBehaviour(type)
  91. , m_menuBookmarksAction(0)
  92. #ifdef Q_WS_MAC
  93. , m_macMenuBar(new QMenuBar())
  94. #endif
  95. , m_actionPrivateBrowsing(0)
  96. , m_statusBarMessage(new StatusBarMessage(this))
  97. , m_usingTransparentBackground(false)
  98. {
  99. setObjectName("mainwindow");
  100. setAttribute(Qt::WA_DeleteOnClose);
  101. setWindowTitle(tr("QupZilla"));
  102. setUpdatesEnabled(false);
  103. m_activeProfil = mApp->getActiveProfilPath();
  104. m_activeLanguage = mApp->getActiveLanguage();
  105. setupUi();
  106. setupMenu();
  107. QTimer::singleShot(0, this, SLOT(postLaunch()));
  108. connect(mApp, SIGNAL(message(Qz::AppMessageType, bool)), this, SLOT(receiveMessage(Qz::AppMessageType, bool)));
  109. }
  110. void QupZilla::postLaunch()
  111. {
  112. loadSettings();
  113. if (m_startBehaviour == Qz::BW_FirstAppWindow) {
  114. m_tabWidget->restorePinnedTabs();
  115. }
  116. //Open tab from command line argument
  117. bool addTab = true;
  118. QStringList arguments = qApp->arguments();
  119. for (int i = 0; i < qApp->arguments().count(); i++) {
  120. QString arg = arguments.at(i);
  121. if (arg.startsWith("-url=")) {
  122. m_tabWidget->addView(QUrl(arg.replace("-url=", "")));
  123. addTab = false;
  124. }
  125. }
  126. Settings settings;
  127. settings.beginGroup("Web-URL-Settings");
  128. int afterLaunch = settings.value("afterLaunch", 1).toInt();
  129. settings.endGroup();
  130. settings.beginGroup("SessionRestore");
  131. bool startingAfterCrash = settings.value("isCrashed", false).toBool();
  132. settings.endGroup();
  133. QUrl startUrl;
  134. switch (afterLaunch) {
  135. case 0:
  136. startUrl = QUrl("");
  137. break;
  138. case 2:
  139. startUrl = QUrl("qupzilla:speeddial");
  140. break;
  141. case 1:
  142. case 3:
  143. startUrl = m_homepage;
  144. break;
  145. default:
  146. break;
  147. }
  148. switch (m_startBehaviour) {
  149. case Qz::BW_FirstAppWindow:
  150. if (startingAfterCrash || (addTab && afterLaunch == 3)) {
  151. addTab = !mApp->restoreStateSlot(this);
  152. }
  153. break;
  154. case Qz::BW_NewWindow:
  155. addTab = true;
  156. break;
  157. case Qz::BW_OtherRestoredWindow:
  158. addTab = false;
  159. break;
  160. }
  161. if (!m_startingUrl.isEmpty()) {
  162. startUrl = QUrl::fromUserInput(m_startingUrl.toString());
  163. addTab = true;
  164. }
  165. if (addTab) {
  166. int index = m_tabWidget->addView(startUrl, Qz::NT_CleanSelectedTab);
  167. m_tabWidget->setCurrentIndex(index);
  168. if (startUrl.isEmpty() || startUrl.toString() == "qupzilla:speeddial") {
  169. locationBar()->setFocus();
  170. }
  171. }
  172. if (m_tabWidget->getTabBar()->normalTabsCount() <= 0 &&
  173. m_startBehaviour != Qz::BW_OtherRestoredWindow) {
  174. //Something went really wrong .. add one tab
  175. m_tabWidget->addView(m_homepage);
  176. }
  177. aboutToShowHistoryMenu(false);
  178. aboutToHideHistoryMenu();
  179. aboutToShowBookmarksMenu();
  180. setUpdatesEnabled(true);
  181. emit startingCompleted();
  182. }
  183. void QupZilla::goNext()
  184. {
  185. weView()->forward();
  186. }
  187. void QupZilla::goBack()
  188. {
  189. weView()->back();
  190. }
  191. void QupZilla::setupUi()
  192. {
  193. int locationBarWidth;
  194. int websearchBarWidth;
  195. Settings settings;
  196. settings.beginGroup("Browser-View-Settings");
  197. if (settings.value("WindowMaximised", false).toBool()) {
  198. resize(800, 550);
  199. setWindowState(Qt::WindowMaximized);
  200. }
  201. else {
  202. setGeometry(settings.value("WindowGeometry", QRect(20, 20, 800, 550)).toRect());
  203. if (m_startBehaviour == Qz::BW_NewWindow) {
  204. // Moving window +40 x,y to be visible that this is new window
  205. QPoint p = pos();
  206. p.setX(p.x() + 40);
  207. p.setY(p.y() + 40);
  208. move(p);
  209. }
  210. }
  211. locationBarWidth = settings.value("LocationBarWidth", 480).toInt();
  212. websearchBarWidth = settings.value("WebSearchBarWidth", 140).toInt();
  213. QWidget* widget = new QWidget(this);
  214. widget->setCursor(Qt::ArrowCursor);
  215. setCentralWidget(widget);
  216. m_mainLayout = new QVBoxLayout(widget);
  217. m_mainLayout->setContentsMargins(0, 0, 0, 0);
  218. m_mainLayout->setSpacing(0);
  219. m_mainSplitter = new QSplitter(this);
  220. m_mainSplitter->setObjectName("sidebar-splitter");
  221. m_mainSplitter->setSizePolicy(QSizePolicy::Preferred, QSizePolicy::Expanding);
  222. m_tabWidget = new TabWidget(this);
  223. m_superMenu = new QMenu(this);
  224. m_navigationBar = new NavigationBar(this);
  225. m_navigationBar->setSplitterSizes(locationBarWidth, websearchBarWidth);
  226. m_bookmarksToolbar = new BookmarksToolbar(this);
  227. m_mainSplitter->addWidget(m_tabWidget);
  228. m_mainLayout->addWidget(m_navigationBar);
  229. m_mainLayout->addWidget(m_bookmarksToolbar);
  230. m_mainLayout->addWidget(m_mainSplitter);
  231. m_mainSplitter->setCollapsible(0, false);
  232. statusBar()->setObjectName("mainwindow-statusbar");
  233. statusBar()->setCursor(Qt::ArrowCursor);
  234. m_progressBar = new ProgressBar(statusBar());
  235. m_privateBrowsing = new QLabel(this);
  236. m_privateBrowsing->setPixmap(QPixmap(":/icons/locationbar/privatebrowsing.png"));
  237. m_privateBrowsing->setVisible(false);
  238. m_privateBrowsing->setToolTip(tr("Private Browsing Enabled"));
  239. m_adblockIcon = new AdBlockIcon(this);
  240. m_ipLabel = new QLabel(this);
  241. m_ipLabel->setObjectName("statusbar-ip-label");
  242. m_ipLabel->setToolTip(tr("IP Address of current page"));
  243. statusBar()->insertPermanentWidget(0, m_progressBar);
  244. statusBar()->insertPermanentWidget(1, m_ipLabel);
  245. statusBar()->insertPermanentWidget(2, m_privateBrowsing);
  246. statusBar()->insertPermanentWidget(3, m_adblockIcon);
  247. }
  248. QMenuBar* QupZilla::menuBar() const
  249. {
  250. #ifdef Q_WS_MAC
  251. return m_macMenuBar;
  252. #else
  253. return QMainWindow::menuBar();
  254. #endif
  255. }
  256. TabbedWebView* QupZilla::weView() const
  257. {
  258. return weView(m_tabWidget->currentIndex());
  259. }
  260. TabbedWebView* QupZilla::weView(int index) const
  261. {
  262. WebTab* webTab = qobject_cast<WebTab*>(m_tabWidget->widget(index));
  263. if (!webTab) {
  264. return 0;
  265. }
  266. return webTab->view();
  267. }
  268. LocationBar* QupZilla::locationBar() const
  269. {
  270. return qobject_cast<LocationBar*>(m_tabWidget->locationBars()->currentWidget());
  271. }
  272. void QupZilla::setupMenu()
  273. {
  274. // Standard actions - needed on Mac to be placed correctly in "application" menu
  275. m_actionAbout = new QAction(QIcon(":/icons/qupzilla.png"), tr("&About QupZilla"), 0);
  276. m_actionAbout->setMenuRole(QAction::AboutRole);
  277. connect(m_actionAbout, SIGNAL(triggered()), this, SLOT(aboutQupZilla()));
  278. m_actionPreferences = new QAction(QIcon(":/icons/faenza/settings.png"), tr("Pr&eferences"), 0);
  279. m_actionPreferences->setMenuRole(QAction::PreferencesRole);
  280. m_actionPreferences->setShortcut(QKeySequence("Ctrl+P"));
  281. connect(m_actionPreferences, SIGNAL(triggered()), this, SLOT(showPreferences()));
  282. m_actionQuit = new QAction(QIcon::fromTheme("application-exit"), tr("Quit"), 0);
  283. m_actionQuit->setMenuRole(QAction::QuitRole);
  284. m_actionQuit->setShortcut(QKeySequence("Ctrl+Q"));
  285. connect(m_actionQuit, SIGNAL(triggered()), this, SLOT(quitApp()));
  286. menuBar()->setObjectName("mainwindow-menubar");
  287. menuBar()->setCursor(Qt::ArrowCursor);
  288. m_menuTools = new QMenu(tr("&Tools"));
  289. m_menuHelp = new QMenu(tr("&Help"));
  290. m_menuBookmarks = new Menu(tr("&Bookmarks"));
  291. m_menuHistory = new Menu(tr("Hi&story"));
  292. connect(m_menuHistory, SIGNAL(aboutToShow()), this, SLOT(aboutToShowHistoryMenu()));
  293. connect(m_menuHistory, SIGNAL(aboutToHide()), this, SLOT(aboutToHideHistoryMenu()));
  294. connect(m_menuBookmarks, SIGNAL(aboutToShow()), this, SLOT(aboutToShowBookmarksMenu()));
  295. connect(m_menuBookmarks, SIGNAL(menuMiddleClicked(Menu*)), this, SLOT(loadFolderBookmarks(Menu*)));
  296. connect(m_menuHelp, SIGNAL(aboutToShow()), this, SLOT(aboutToShowHelpMenu()));
  297. connect(m_menuTools, SIGNAL(aboutToShow()), this, SLOT(aboutToShowToolsMenu()));
  298. m_menuFile = new QMenu(tr("&File"));
  299. m_menuFile->addAction(QIcon::fromTheme("window-new"), tr("&New Window"), this, SLOT(newWindow()))->setShortcut(QKeySequence("Ctrl+N"));
  300. m_menuFile->addAction(QIcon(":/icons/menu/popup.png"), tr("New Tab"), this, SLOT(addTab()))->setShortcut(QKeySequence("Ctrl+T"));
  301. m_menuFile->addAction(QIcon::fromTheme("document-open-remote"), tr("Open Location"), this, SLOT(openLocation()))->setShortcut(QKeySequence("Ctrl+L"));
  302. m_menuFile->addAction(QIcon::fromTheme("document-open"), tr("Open &File"), this, SLOT(openFile()))->setShortcut(QKeySequence("Ctrl+O"));
  303. m_menuFile->addAction(tr("Close Tab"), m_tabWidget, SLOT(closeTab()))->setShortcut(QKeySequence("Ctrl+W"));
  304. m_actionCloseWindow = m_menuFile->addAction(QIcon::fromTheme("window-close"), tr("Close Window"), this, SLOT(close()));
  305. m_actionCloseWindow->setShortcut(QKeySequence("Ctrl+Shift+W"));
  306. m_menuFile->addSeparator();
  307. m_menuFile->addAction(QIcon::fromTheme("document-save"), tr("&Save Page As..."), this, SLOT(savePage()))->setShortcut(QKeySequence("Ctrl+S"));
  308. m_menuFile->addAction(tr("Save Page Screen"), this, SLOT(savePageScreen()));
  309. m_menuFile->addAction(QIcon::fromTheme("mail-message-new"), tr("Send Link..."), this, SLOT(sendLink()));
  310. m_menuFile->addAction(QIcon::fromTheme("document-print"), tr("&Print"), this, SLOT(printPage()));
  311. m_menuFile->addSeparator();
  312. m_menuFile->addSeparator();
  313. m_menuFile->addAction(tr("Import bookmarks..."), this, SLOT(showBookmarkImport()));
  314. m_menuFile->addAction(m_actionQuit);
  315. #ifdef Q_WS_MAC // Add standard actions to File Menu (as it won't be ever cleared) and Mac menubar should move them to "application" menu
  316. m_menuFile->addAction(m_actionAbout);
  317. m_menuFile->addAction(m_actionPreferences);
  318. #endif
  319. menuBar()->addMenu(m_menuFile);
  320. connect(m_menuFile, SIGNAL(aboutToShow()), this, SLOT(aboutToShowFileMenu()));
  321. connect(m_menuFile, SIGNAL(aboutToHide()), this, SLOT(aboutToHideFileMenu()));
  322. m_menuEdit = new QMenu(tr("&Edit"));
  323. m_menuEdit->addAction(QIcon::fromTheme("edit-undo"), tr("&Undo"))->setShortcut(QKeySequence("Ctrl+Z"));
  324. m_menuEdit->addAction(QIcon::fromTheme("edit-redo"), tr("&Redo"))->setShortcut(QKeySequence("Ctrl+Shift+Z"));
  325. m_menuEdit->addSeparator();
  326. m_menuEdit->addAction(QIcon::fromTheme("edit-cut"), tr("&Cut"))->setShortcut(QKeySequence("Ctrl+X"));
  327. m_menuEdit->addAction(QIcon::fromTheme("edit-copy"), tr("C&opy"), this, SLOT(copy()))->setShortcut(QKeySequence("Ctrl+C"));
  328. m_menuEdit->addAction(QIcon::fromTheme("edit-paste"), tr("&Paste"))->setShortcut(QKeySequence("Ctrl+V"));
  329. m_menuEdit->addAction(QIcon::fromTheme("edit-delete"), tr("&Delete"))->setShortcut(QKeySequence("Del"));
  330. m_menuEdit->addSeparator();
  331. m_menuEdit->addAction(QIcon::fromTheme("edit-select-all"), tr("Select &All"), this, SLOT(selectAll()))->setShortcut(QKeySequence("Ctrl+A"));
  332. m_menuEdit->addAction(QIcon::fromTheme("edit-find"), tr("&Find"), this, SLOT(searchOnPage()))->setShortcut(QKeySequence("Ctrl+F"));
  333. m_menuEdit->addSeparator();
  334. #ifdef Q_WS_X11
  335. m_menuEdit->addAction(m_actionPreferences);
  336. #endif
  337. menuBar()->addMenu(m_menuEdit);
  338. connect(m_menuEdit, SIGNAL(aboutToShow()), this, SLOT(aboutToShowEditMenu()));
  339. connect(m_menuEdit, SIGNAL(aboutToHide()), this, SLOT(aboutToHideEditMenu()));
  340. aboutToHideEditMenu();
  341. m_menuView = new QMenu(tr("&View"));
  342. m_actionShowToolbar = new QAction(tr("&Navigation Toolbar"), this);
  343. m_actionShowToolbar->setCheckable(true);
  344. connect(m_actionShowToolbar, SIGNAL(triggered(bool)), this, SLOT(showNavigationToolbar()));
  345. m_actionShowBookmarksToolbar = new QAction(tr("&Bookmarks Toolbar"), this);
  346. m_actionShowBookmarksToolbar->setCheckable(true);
  347. connect(m_actionShowBookmarksToolbar, SIGNAL(triggered(bool)), this, SLOT(showBookmarksToolbar()));
  348. m_actionShowStatusbar = new QAction(tr("Sta&tus Bar"), this);
  349. m_actionShowStatusbar->setCheckable(true);
  350. connect(m_actionShowStatusbar, SIGNAL(triggered(bool)), this, SLOT(showStatusbar()));
  351. m_actionShowMenubar = new QAction(tr("&Menu Bar"), this);
  352. m_actionShowMenubar->setCheckable(true);
  353. connect(m_actionShowMenubar, SIGNAL(triggered(bool)), this, SLOT(showMenubar()));
  354. m_actionShowFullScreen = new QAction(tr("&Fullscreen"), this);
  355. m_actionShowFullScreen->setCheckable(true);
  356. m_actionShowFullScreen->setShortcut(QKeySequence("F11"));
  357. connect(m_actionShowFullScreen, SIGNAL(triggered(bool)), this, SLOT(fullScreen(bool)));
  358. m_actionStop = new QAction(IconProvider::standardIcon(QStyle::SP_BrowserStop), tr("&Stop"), this);
  359. connect(m_actionStop, SIGNAL(triggered()), this, SLOT(stop()));
  360. m_actionStop->setShortcut(QKeySequence("Esc"));
  361. m_actionReload = new QAction(IconProvider::standardIcon(QStyle::SP_BrowserReload), tr("&Reload"), this);
  362. connect(m_actionReload, SIGNAL(triggered()), this, SLOT(reload()));
  363. m_actionReload->setShortcut(QKeySequence("F5"));
  364. QAction* actionEncoding = new QAction(tr("Character &Encoding"), this);
  365. m_menuEncoding = new QMenu(this);
  366. actionEncoding->setMenu(m_menuEncoding);
  367. connect(m_menuEncoding, SIGNAL(aboutToShow()), this, SLOT(aboutToShowEncodingMenu()));
  368. m_actionShowBookmarksSideBar = new QAction(tr("Bookmarks"), this);
  369. m_actionShowBookmarksSideBar->setCheckable(true);
  370. m_actionShowBookmarksSideBar->setShortcut(QKeySequence("Ctrl+B"));
  371. connect(m_actionShowBookmarksSideBar, SIGNAL(triggered()), this, SLOT(showBookmarksSideBar()));
  372. m_actionShowHistorySideBar = new QAction(tr("History"), this);
  373. m_actionShowHistorySideBar->setCheckable(true);
  374. m_actionShowHistorySideBar->setShortcut(QKeySequence("Ctrl+H"));
  375. connect(m_actionShowHistorySideBar, SIGNAL(triggered()), this, SLOT(showHistorySideBar()));
  376. QMenu* toolbarsMenu = new QMenu(tr("Toolbars"));
  377. toolbarsMenu->addAction(m_actionShowMenubar);
  378. toolbarsMenu->addAction(m_actionShowToolbar);
  379. toolbarsMenu->addAction(m_actionShowBookmarksToolbar);
  380. QMenu* sidebarsMenu = new QMenu(tr("Sidebars"));
  381. sidebarsMenu->addAction(m_actionShowBookmarksSideBar);
  382. sidebarsMenu->addAction(m_actionShowHistorySideBar);
  383. m_menuView->addMenu(toolbarsMenu);
  384. m_menuView->addMenu(sidebarsMenu);
  385. m_menuView->addAction(m_actionShowStatusbar);
  386. m_menuView->addSeparator();
  387. m_menuView->addAction(m_actionStop);
  388. m_menuView->addAction(m_actionReload);
  389. m_menuView->addSeparator();
  390. m_menuView->addAction(QIcon::fromTheme("zoom-in"), tr("Zoom &In"), this, SLOT(zoomIn()))->setShortcut(QKeySequence("Ctrl++"));
  391. m_menuView->addAction(QIcon::fromTheme("zoom-out"), tr("Zoom &Out"), this, SLOT(zoomOut()))->setShortcut(QKeySequence("Ctrl+-"));
  392. m_menuView->addAction(QIcon::fromTheme("zoom-original"), tr("Reset"), this, SLOT(zoomReset()))->setShortcut(QKeySequence("Ctrl+0"));
  393. m_menuView->addSeparator();
  394. m_menuView->addAction(actionEncoding);
  395. m_menuView->addSeparator();
  396. m_menuView->addAction(QIcon::fromTheme("text-html"), tr("&Page Source"), this, SLOT(showSource()))->setShortcut(QKeySequence("Ctrl+U"));
  397. m_menuView->addAction(m_actionShowFullScreen);
  398. menuBar()->addMenu(m_menuView);
  399. connect(m_menuView, SIGNAL(aboutToShow()), this, SLOT(aboutToShowViewMenu()));
  400. connect(m_menuView, SIGNAL(aboutToHide()), this, SLOT(aboutToHideViewMenu()));
  401. menuBar()->addMenu(m_menuHistory);
  402. menuBar()->addMenu(m_menuBookmarks);
  403. menuBar()->addMenu(m_menuTools);
  404. menuBar()->addMenu(m_menuHelp);
  405. menuBar()->setContextMenuPolicy(Qt::CustomContextMenu);
  406. m_menuClosedTabs = new QMenu(tr("Closed Tabs"));
  407. connect(m_menuClosedTabs, SIGNAL(aboutToShow()), this, SLOT(aboutToShowClosedTabsMenu()));
  408. aboutToShowToolsMenu();
  409. aboutToShowHelpMenu();
  410. m_actionRestoreTab = new QAction(QIcon::fromTheme("user-trash"), tr("Restore &Closed Tab"), this);
  411. m_actionRestoreTab->setShortcut(QKeySequence("Ctrl+Shift+T"));
  412. connect(m_actionRestoreTab, SIGNAL(triggered()), m_tabWidget, SLOT(restoreClosedTab()));
  413. addAction(m_actionRestoreTab);
  414. QShortcut* reloadByPassCacheAction = new QShortcut(QKeySequence("Ctrl+F5"), this);
  415. QShortcut* reloadByPassCacheAction2 = new QShortcut(QKeySequence("Ctrl+Shift+R"), this);
  416. connect(reloadByPassCacheAction, SIGNAL(activated()), this, SLOT(reloadByPassCache()));
  417. connect(reloadByPassCacheAction2, SIGNAL(activated()), this, SLOT(reloadByPassCache()));
  418. QShortcut* reloadAction = new QShortcut(QKeySequence("Ctrl+R"), this);
  419. connect(reloadAction, SIGNAL(activated()), this, SLOT(reload()));
  420. QShortcut* backAction = new QShortcut(QKeySequence("Alt+Left"), this);
  421. connect(backAction, SIGNAL(activated()), this, SLOT(goBack()));
  422. QShortcut* forwardAction = new QShortcut(QKeySequence("Alt+Right"), this);
  423. connect(forwardAction, SIGNAL(activated()), this, SLOT(goNext()));
  424. // Make shortcuts available even in fullscreen (menu hidden)
  425. QList<QAction*> actions = menuBar()->actions();
  426. foreach(QAction * action, actions) {
  427. if (action->menu()) {
  428. actions += action->menu()->actions();
  429. }
  430. addAction(action);
  431. }
  432. m_superMenu->addMenu(m_menuFile);
  433. m_superMenu->addMenu(m_menuEdit);
  434. m_superMenu->addMenu(m_menuView);
  435. m_superMenu->addMenu(m_menuHistory);
  436. m_superMenu->addMenu(m_menuBookmarks);
  437. m_superMenu->addMenu(m_menuTools);
  438. m_superMenu->addMenu(m_menuHelp);
  439. }
  440. void QupZilla::loadSettings()
  441. {
  442. Settings settings;
  443. //Url settings
  444. settings.beginGroup("Web-URL-Settings");
  445. m_homepage = settings.value("homepage", "qupzilla:start").toUrl();
  446. m_newtab = settings.value("newTabUrl", "qupzilla:speeddial").toUrl();
  447. settings.endGroup();
  448. QWebSettings* websettings = mApp->webSettings();
  449. websettings->setAttribute(QWebSettings::JavascriptCanAccessClipboard, true);
  450. //Browser Window settings
  451. settings.beginGroup("Browser-View-Settings");
  452. m_menuTextColor = settings.value("menuTextColor", QColor(Qt::black)).value<QColor>();
  453. bool showStatusBar = settings.value("showStatusBar", true).toBool();
  454. bool showHomeIcon = settings.value("showHomeButton", true).toBool();
  455. bool showBackForwardIcons = settings.value("showBackForwardButtons", true).toBool();
  456. bool showBookmarksToolbar = settings.value("showBookmarksToolbar", true).toBool();
  457. bool showNavigationToolbar = settings.value("showNavigationToolbar", true).toBool();
  458. bool showMenuBar = settings.value("showMenubar", true).toBool();
  459. bool showAddTab = settings.value("showAddTabButton", false).toBool();
  460. bool makeTransparent = settings.value("useTransparentBackground", false).toBool();
  461. m_sideBarWidth = settings.value("SideBarWidth", 250).toInt();
  462. m_webViewWidth = settings.value("WebViewWidth", 390).toInt();
  463. QString activeSideBar = settings.value("SideBar", "None").toString();
  464. settings.endGroup();
  465. bool adBlockEnabled = settings.value("AdBlock/enabled", true).toBool();
  466. m_adblockIcon->setEnabled(adBlockEnabled);
  467. statusBar()->setVisible(showStatusBar);
  468. m_bookmarksToolbar->setVisible(showBookmarksToolbar);
  469. m_navigationBar->setVisible(showNavigationToolbar);
  470. menuBar()->setVisible(showMenuBar);
  471. m_navigationBar->buttonSuperMenu()->setVisible(!showMenuBar);
  472. m_navigationBar->buttonHome()->setVisible(showHomeIcon);
  473. m_navigationBar->buttonBack()->setVisible(showBackForwardIcons);
  474. m_navigationBar->buttonNext()->setVisible(showBackForwardIcons);
  475. m_navigationBar->buttonAddTab()->setVisible(showAddTab);
  476. if (activeSideBar != "None") {
  477. if (activeSideBar == "Bookmarks") {
  478. m_actionShowBookmarksSideBar->trigger();
  479. }
  480. else if (activeSideBar == "History") {
  481. m_actionShowHistorySideBar->trigger();
  482. }
  483. }
  484. //Private browsing
  485. m_actionPrivateBrowsing->setChecked(mApp->webSettings()->testAttribute(QWebSettings::PrivateBrowsingEnabled));
  486. m_privateBrowsing->setVisible(mApp->webSettings()->testAttribute(QWebSettings::PrivateBrowsingEnabled));
  487. #ifdef Q_WS_WIN
  488. if (m_usingTransparentBackground && !makeTransparent) {
  489. QtWin::enableBlurBehindWindow(this, false);
  490. m_usingTransparentBackground = false;
  491. }
  492. #endif
  493. if (!makeTransparent) {
  494. return;
  495. }
  496. //Opacity
  497. #ifdef Q_WS_X11
  498. setAttribute(Qt::WA_TranslucentBackground);
  499. setAttribute(Qt::WA_NoSystemBackground, false);
  500. QPalette pal = palette();
  501. QColor bg = pal.window().color();
  502. bg.setAlpha(180);
  503. pal.setColor(QPalette::Window, bg);
  504. setPalette(pal);
  505. ensurePolished(); // workaround Oxygen filling the background
  506. setAttribute(Qt::WA_StyledBackground, false);
  507. #endif
  508. if (QtWin::isCompositionEnabled()) {
  509. QtWin::extendFrameIntoClientArea(this);
  510. setContentsMargins(0, 0, 0, 0);
  511. m_usingTransparentBackground = true;
  512. }
  513. }
  514. void QupZilla::setWindowTitle(const QString &t)
  515. {
  516. if (mApp->webSettings()->testAttribute(QWebSettings::PrivateBrowsingEnabled)) {
  517. QMainWindow::setWindowTitle(t + tr(" (Private Browsing)"));
  518. }
  519. else {
  520. QMainWindow::setWindowTitle(t);
  521. }
  522. }
  523. void QupZilla::receiveMessage(Qz::AppMessageType mes, bool state)
  524. {
  525. switch (mes) {
  526. case Qz::AM_SetAdBlockIconEnabled:
  527. m_adblockIcon->setEnabled(state);
  528. break;
  529. case Qz::AM_CheckPrivateBrowsing:
  530. m_privateBrowsing->setVisible(state);
  531. m_actionPrivateBrowsing->setChecked(state);
  532. weView()->titleChanged();
  533. break;
  534. case Qz::AM_ReloadSettings:
  535. loadSettings();
  536. m_tabWidget->loadSettings();
  537. LocationBarSettings::instance()->loadSettings();
  538. break;
  539. case Qz::AM_HistoryStateChanged:
  540. m_historyMenuChanged = true;
  541. break;
  542. case Qz::AM_BookmarksChanged:
  543. m_bookmarksMenuChanged = true;
  544. break;
  545. case Qz::AM_StartPrivateBrowsing:
  546. startPrivate(state);
  547. break;
  548. default:
  549. qWarning("Unresolved message sent! This could never happen!");
  550. break;
  551. }
  552. }
  553. void QupZilla::aboutToShowFileMenu()
  554. {
  555. m_actionCloseWindow->setEnabled(mApp->windowCount() > 1);
  556. }
  557. void QupZilla::aboutToHideFileMenu()
  558. {
  559. m_actionCloseWindow->setEnabled(true);
  560. }
  561. void QupZilla::aboutToShowBookmarksMenu()
  562. {
  563. if (!m_bookmarksMenuChanged) {
  564. if (m_menuBookmarksAction) {
  565. m_menuBookmarksAction->setVisible(m_bookmarksToolbar->isVisible());
  566. }
  567. return;
  568. }
  569. m_bookmarksMenuChanged = false;
  570. m_menuBookmarks->clear();
  571. m_menuBookmarks->addAction(tr("Bookmark &This Page"), this, SLOT(bookmarkPage()))->setShortcut(QKeySequence("Ctrl+D"));
  572. m_menuBookmarks->addAction(tr("Bookmark &All Tabs"), this, SLOT(bookmarkAllTabs()));
  573. m_menuBookmarks->addAction(IconProvider::fromTheme("user-bookmarks"), tr("Organize &Bookmarks"), this, SLOT(showBookmarksManager()))->setShortcut(QKeySequence("Ctrl+Shift+O"));
  574. m_menuBookmarks->addSeparator();
  575. QSqlQuery query;
  576. query.exec("SELECT title, url, icon FROM bookmarks WHERE folder='bookmarksMenu'");
  577. while (query.next()) {
  578. QString title = query.value(0).toString();
  579. QUrl url = query.value(1).toUrl();
  580. QIcon icon = IconProvider::iconFromImage(QImage::fromData(query.value(2).toByteArray()));
  581. if (title.length() > 40) {
  582. title.truncate(40);
  583. title += "..";
  584. }
  585. Action* act = new Action(icon, title);
  586. act->setData(url);
  587. connect(act, SIGNAL(triggered()), this, SLOT(loadActionUrl()));
  588. connect(act, SIGNAL(middleClicked()), this, SLOT(loadActionUrlInNewNotSelectedTab()));
  589. m_menuBookmarks->addAction(act);
  590. }
  591. Menu* menuBookmarks = new Menu(_bookmarksToolbar, m_menuBookmarks);
  592. menuBookmarks->setIcon(QIcon(style()->standardIcon(QStyle::SP_DirOpenIcon)));
  593. query.exec("SELECT title, url, icon FROM bookmarks WHERE folder='bookmarksToolbar'");
  594. while (query.next()) {
  595. QString title = query.value(0).toString();
  596. QUrl url = query.value(1).toUrl();
  597. QIcon icon = IconProvider::iconFromImage(QImage::fromData(query.value(2).toByteArray()));
  598. if (title.length() > 40) {
  599. title.truncate(40);
  600. title += "..";
  601. }
  602. Action* act = new Action(icon, title);
  603. act->setData(url);
  604. connect(act, SIGNAL(triggered()), this, SLOT(loadActionUrl()));
  605. connect(act, SIGNAL(middleClicked()), this, SLOT(loadActionUrlInNewNotSelectedTab()));
  606. menuBookmarks->addAction(act);
  607. }
  608. if (menuBookmarks->isEmpty()) {
  609. menuBookmarks->addAction(tr("Empty"));
  610. }
  611. m_menuBookmarksAction = m_menuBookmarks->addMenu(menuBookmarks);
  612. query.exec("SELECT name FROM folders");
  613. while (query.next()) {
  614. QString folderName = query.value(0).toString();
  615. Menu* tempFolder = new Menu(folderName, m_menuBookmarks);
  616. tempFolder->setIcon(QIcon(style()->standardIcon(QStyle::SP_DirOpenIcon)));
  617. QSqlQuery query2;
  618. query2.exec("SELECT title, url, icon FROM bookmarks WHERE folder='" + folderName + "'");
  619. while (query2.next()) {
  620. QString title = query2.value(0).toString();
  621. QUrl url = query2.value(1).toUrl();
  622. QIcon icon = IconProvider::iconFromImage(QImage::fromData(query2.value(2).toByteArray()));
  623. if (title.length() > 40) {
  624. title.truncate(40);
  625. title += "..";
  626. }
  627. Action* act = new Action(icon, title);
  628. act->setData(url);
  629. connect(act, SIGNAL(triggered()), this, SLOT(loadActionUrl()));
  630. connect(act, SIGNAL(middleClicked()), this, SLOT(loadActionUrlInNewNotSelectedTab()));
  631. tempFolder->addAction(act);
  632. }
  633. if (tempFolder->isEmpty()) {
  634. tempFolder->addAction(tr("Empty"));
  635. }
  636. m_menuBookmarks->addMenu(tempFolder);
  637. }
  638. m_menuBookmarksAction->setVisible(m_bookmarksToolbar->isVisible());
  639. }
  640. void QupZilla::aboutToShowHistoryMenu(bool loadHistory)
  641. {
  642. if (!weView()) {
  643. return;
  644. }
  645. if (!m_historyMenuChanged) {
  646. if (!m_menuHistory || m_menuHistory->actions().count() < 3) {
  647. return;
  648. }
  649. m_menuHistory->actions().at(0)->setEnabled(WebHistoryWrapper::canGoBack(weView()->history()));
  650. m_menuHistory->actions().at(1)->setEnabled(WebHistoryWrapper::canGoForward(weView()->history()));
  651. return;
  652. }
  653. m_historyMenuChanged = false;
  654. if (!loadHistory) {
  655. m_historyMenuChanged = true;
  656. }
  657. m_menuHistory->clear();
  658. m_menuHistory->addAction(IconProvider::standardIcon(QStyle::SP_ArrowBack), tr("&Back"), this, SLOT(goBack()))->setShortcut(QKeySequence("Ctrl+Left"));
  659. m_menuHistory->addAction(IconProvider::standardIcon(QStyle::SP_ArrowForward), tr("&Forward"), this, SLOT(goNext()))->setShortcut(QKeySequence("Ctrl+Right"));
  660. m_menuHistory->addAction(IconProvider::fromTheme("go-home"), tr("&Home"), this, SLOT(goHome()))->setShortcut(QKeySequence("Alt+Home"));
  661. m_menuHistory->actions().at(0)->setEnabled(WebHistoryWrapper::canGoBack(weView()->history()));
  662. m_menuHistory->actions().at(1)->setEnabled(WebHistoryWrapper::canGoForward(weView()->history()));
  663. m_menuHistory->addAction(QIcon(":/icons/menu/history.png"), tr("Show &All History"), this, SLOT(showHistoryManager()))->setShortcut(QKeySequence("Ctrl+Shift+H"));
  664. m_menuHistory->addSeparator();
  665. if (loadHistory) {
  666. QSqlQuery query;
  667. query.exec("SELECT title, url FROM history ORDER BY date DESC LIMIT 10");
  668. while (query.next()) {
  669. QUrl url = query.value(1).toUrl();
  670. QString title = query.value(0).toString();
  671. if (title.length() > 40) {
  672. title.truncate(40);
  673. title += "..";
  674. }
  675. Action* act = new Action(_iconForUrl(url), title);
  676. act->setData(url);
  677. connect(act, SIGNAL(triggered()), this, SLOT(loadActionUrl()));
  678. connect(act, SIGNAL(middleClicked()), this, SLOT(loadActionUrlInNewNotSelectedTab()));
  679. m_menuHistory->addAction(act);
  680. }
  681. m_menuHistory->addSeparator();
  682. }
  683. m_menuHistory->addMenu(m_menuClosedTabs);
  684. }
  685. void QupZilla::aboutToHideHistoryMenu()
  686. {
  687. if (!m_menuHistory || m_menuHistory->actions().count() < 3) {
  688. return;
  689. }
  690. m_menuHistory->actions().at(0)->setEnabled(true);
  691. m_menuHistory->actions().at(1)->setEnabled(true);
  692. }
  693. void QupZilla::aboutToShowClosedTabsMenu()
  694. {
  695. m_menuClosedTabs->clear();
  696. int i = 0;
  697. foreach(ClosedTabsManager::Tab tab, m_tabWidget->closedTabsManager()->allClosedTabs()) {
  698. QString title = tab.title;
  699. if (title.length() > 40) {
  700. title.truncate(40);
  701. title += "..";
  702. }
  703. m_menuClosedTabs->addAction(_iconForUrl(tab.url), title, m_tabWidget, SLOT(restoreClosedTab()))->setData(i);
  704. i++;
  705. }
  706. m_menuClosedTabs->addSeparator();
  707. if (i == 0) {
  708. m_menuClosedTabs->addAction(tr("Empty"))->setEnabled(false);
  709. }
  710. else {
  711. m_menuClosedTabs->addAction(tr("Restore All Closed Tabs"), m_tabWidget, SLOT(restoreAllClosedTabs()));
  712. m_menuClosedTabs->addAction(tr("Clear list"), m_tabWidget, SLOT(clearClosedTabsList()));
  713. }
  714. }
  715. void QupZilla::aboutToShowHelpMenu()
  716. {
  717. m_menuHelp->clear();
  718. mApp->plugins()->populateHelpMenu(m_menuHelp);
  719. m_menuHelp->addSeparator();
  720. #ifndef Q_WS_MAC
  721. m_menuHelp->addAction(QIcon(":/icons/menu/qt.png"), tr("About &Qt"), qApp, SLOT(aboutQt()));
  722. m_menuHelp->addAction(m_actionAbout);
  723. m_menuHelp->addSeparator();
  724. #endif
  725. QAction* infoAction = new QAction(QIcon(":/icons/menu/informations.png"), tr("Information about application"), m_menuHelp);
  726. infoAction->setData(QUrl("qupzilla:about"));
  727. infoAction->setShortcut(QKeySequence(QKeySequence::HelpContents));
  728. connect(infoAction, SIGNAL(triggered()), this, SLOT(loadActionUrlInNewTab()));
  729. m_menuHelp->addAction(infoAction);
  730. m_menuHelp->addAction(tr("Report &Issue"), this, SLOT(loadActionUrlInNewTab()))->setData(QUrl("qupzilla:reportbug"));
  731. }
  732. void QupZilla::aboutToShowToolsMenu()
  733. {
  734. m_menuTools->clear();
  735. m_menuTools->addAction(tr("&Web Search"), this, SLOT(webSearch()))->setShortcut(QKeySequence("Ctrl+K"));
  736. m_menuTools->addAction(QIcon::fromTheme("dialog-information"), tr("Page &Info"), this, SLOT(showPageInfo()))->setShortcut(QKeySequence("Ctrl+I"));
  737. m_menuTools->addSeparator();
  738. m_menuTools->addAction(tr("&Download Manager"), this, SLOT(showDownloadManager()))->setShortcut(QKeySequence("Ctrl+Y"));
  739. m_menuTools->addAction(tr("&Cookies Manager"), this, SLOT(showCookieManager()));
  740. m_menuTools->addAction(tr("&AdBlock"), AdBlockManager::instance(), SLOT(showDialog()));
  741. m_menuTools->addAction(QIcon(":/icons/menu/rss.png"), tr("RSS &Reader"), this, SLOT(showRSSManager()));
  742. m_menuTools->addAction(QIcon::fromTheme("edit-clear"), tr("Clear Recent &History"), this, SLOT(showClearPrivateData()));
  743. m_actionPrivateBrowsing = new QAction(tr("&Private Browsing"), this);
  744. m_actionPrivateBrowsing->setShortcut(QKeySequence("Ctrl+Shift+P"));
  745. m_actionPrivateBrowsing->setCheckable(true);
  746. m_actionPrivateBrowsing->setChecked(mApp->webSettings()->testAttribute(QWebSettings::PrivateBrowsingEnabled));
  747. connect(m_actionPrivateBrowsing, SIGNAL(triggered(bool)), this, SLOT(startPrivate(bool)));
  748. m_menuTools->addAction(m_actionPrivateBrowsing);
  749. m_menuTools->addSeparator();
  750. mApp->plugins()->populateToolsMenu(m_menuTools);
  751. #if !defined(Q_WS_X11) && !defined(Q_WS_MAC)
  752. m_menuTools->addAction(m_actionPreferences);
  753. #endif
  754. }
  755. void QupZilla::aboutToShowViewMenu()
  756. {
  757. if (!weView()) {
  758. return;
  759. }
  760. m_actionShowToolbar->setChecked(m_navigationBar->isVisible());
  761. m_actionShowMenubar->setChecked(menuBar()->isVisible());
  762. m_actionShowStatusbar->setChecked(statusBar()->isVisible());
  763. m_actionShowBookmarksToolbar->setChecked(m_bookmarksToolbar->isVisible());
  764. if (!m_sideBar) {
  765. m_actionShowBookmarksSideBar->setChecked(false);
  766. m_actionShowHistorySideBar->setChecked(false);
  767. // m_actionShowRssSideBar->setChecked(false);
  768. }
  769. else {
  770. SideBar::SideWidget actWidget = m_sideBar.data()->activeWidget();
  771. m_actionShowBookmarksSideBar->setChecked(actWidget == SideBar::Bookmarks);
  772. m_actionShowHistorySideBar->setChecked(actWidget == SideBar::History);
  773. // m_actionShowRssSideBar->setChecked(actWidget == SideBar::RSS);
  774. }
  775. }
  776. void QupZilla::aboutToHideViewMenu()
  777. {
  778. if (m_mainLayout->count() == 4) {
  779. SearchToolBar* search = qobject_cast<SearchToolBar*>(m_mainLayout->itemAt(3)->widget());
  780. if (!search) {
  781. return;
  782. }
  783. m_actionStop->setEnabled(false);
  784. }
  785. }
  786. void QupZilla::aboutToShowEditMenu()
  787. {
  788. foreach(QAction * act, m_menuEdit->actions()) {
  789. act->setEnabled(true);
  790. }
  791. }
  792. void QupZilla::aboutToHideEditMenu()
  793. {
  794. foreach(QAction * act, m_menuEdit->actions()) {
  795. act->setEnabled(false);
  796. }
  797. m_menuEdit->actions().at(9)->setEnabled(true);
  798. #ifdef Q_WS_X11
  799. m_menuEdit->actions().at(11)->setEnabled(true);
  800. #endif
  801. }
  802. void QupZilla::aboutToShowEncodingMenu()
  803. {
  804. m_menuEncoding->clear();
  805. QMenu* menuISO = new QMenu("ISO", this);
  806. QMenu* menuUTF = new QMenu("UTF", this);
  807. QMenu* menuWindows = new QMenu("Windows", this);
  808. QMenu* menuIscii = new QMenu("Iscii", this);
  809. QMenu* menuOther = new QMenu(tr("Other"), this);
  810. QList<QByteArray> available = QTextCodec::availableCodecs();
  811. qSort(available);
  812. QString activeCodec = mApp->webSettings()->defaultTextEncoding();
  813. foreach(QByteArray name, available) {
  814. if (QTextCodec::codecForName(name)->aliases().contains(name)) {
  815. continue;
  816. }
  817. QAction* action = new QAction(name == "System" ? tr("Default") : name, this);
  818. action->setData(name);
  819. action->setCheckable(true);
  820. connect(action, SIGNAL(triggered()), this, SLOT(changeEncoding()));
  821. if (activeCodec.compare(name, Qt::CaseInsensitive) == 0) {
  822. action->setChecked(true);
  823. }
  824. if (name.startsWith("ISO")) {
  825. menuISO->addAction(action);
  826. }
  827. else if (name.startsWith("UTF")) {
  828. menuUTF->addAction(action);
  829. }
  830. else if (name.startsWith("windows")) {
  831. menuWindows->addAction(action);
  832. }
  833. else if (name.startsWith("Iscii")) {
  834. menuIscii->addAction(action);
  835. }
  836. else if (name == "System") {
  837. m_menuEncoding->addAction(action);
  838. }
  839. else {
  840. menuOther->addAction(action);
  841. }
  842. }
  843. m_menuEncoding->addSeparator();
  844. if (!menuISO->isEmpty()) {
  845. m_menuEncoding->addMenu(menuISO);
  846. }
  847. if (!menuUTF->isEmpty()) {
  848. m_menuEncoding->addMenu(menuUTF);
  849. }
  850. if (!menuWindows->isEmpty()) {
  851. m_menuEncoding->addMenu(menuWindows);
  852. }
  853. if (!menuIscii->isEmpty()) {
  854. m_menuEncoding->addMenu(menuIscii);
  855. }
  856. if (!menuOther->isEmpty()) {
  857. m_menuEncoding->addMenu(menuOther);
  858. }
  859. }
  860. void QupZilla::changeEncoding()
  861. {
  862. if (QAction* action = qobject_cast<QAction*>(sender())) {
  863. mApp->webSettings()->setDefaultTextEncoding(action->data().toString());
  864. reload();
  865. }
  866. }
  867. void QupZilla::bookmarkPage()
  868. {
  869. mApp->browsingLibrary()->bookmarksManager()->addBookmark(weView());
  870. }
  871. void QupZilla::addBookmark(const QUrl &url, const QString &title, const QIcon &icon)
  872. {
  873. mApp->browsingLibrary()->bookmarksManager()->insertBookmark(url, title, icon);
  874. }
  875. void QupZilla::bookmarkAllTabs()
  876. {
  877. mApp->browsingLibrary()->bookmarksManager()->insertAllTabs();
  878. }
  879. void QupZilla::newWindow()
  880. {
  881. mApp->makeNewWindow(Qz::BW_NewWindow);
  882. }
  883. void QupZilla::goHome()
  884. {
  885. loadAddress(m_homepage);
  886. }
  887. void QupZilla::copy()
  888. {
  889. if (!weView()->selectedText().isEmpty()) {
  890. QApplication::clipboard()->setText(weView()->selectedText());
  891. }
  892. }
  893. void QupZilla::selectAll()
  894. {
  895. weView()->selectAll();
  896. }
  897. void QupZilla::zoomIn()
  898. {
  899. weView()->zoomIn();
  900. }
  901. void QupZilla::zoomOut()
  902. {
  903. weView()->zoomOut();
  904. }
  905. void QupZilla::zoomReset()
  906. {
  907. weView()->zoomReset();
  908. }
  909. void QupZilla::goHomeInNewTab()
  910. {
  911. m_tabWidget->addView(m_homepage, Qz::NT_SelectedTab);
  912. }
  913. void QupZilla::stop()
  914. {
  915. weView()->stop();
  916. }
  917. void QupZilla::reload()
  918. {
  919. weView()->reload();
  920. }
  921. void QupZilla::reloadByPassCache()
  922. {
  923. weView()->triggerPageAction(QWebPage::ReloadAndBypassCache);
  924. }
  925. void QupZilla::loadActionUrl()
  926. {
  927. if (QAction* action = qobject_cast<QAction*>(sender())) {
  928. loadAddress(action->data().toUrl());
  929. }
  930. }
  931. void QupZilla::loadActionUrlInNewTab()
  932. {
  933. if (QAction* action = qobject_cast<QAction*>(sender())) {
  934. m_tabWidget->addView(action->data().toUrl());
  935. }
  936. }
  937. void QupZilla::loadActionUrlInNewNotSelectedTab()
  938. {
  939. if (QAction* action = qobject_cast<QAction*>(sender())) {
  940. m_tabWidget->addView(action->data().toUrl(), Qz::NT_NotSelectedTab);
  941. }
  942. }
  943. void QupZilla::loadFolderBookmarks(Menu* menu)
  944. {
  945. QString folder = BookmarksModel::fromTranslatedFolder(menu->title());
  946. if (folder.isEmpty()) {
  947. return;
  948. }
  949. foreach(Bookmark b, mApp->bookmarksModel()->folderBookmarks(folder)) {
  950. tabWidget()->addView(b.url, b.title, Qz::NT_NotSelectedTab);
  951. }
  952. }
  953. void QupZilla::loadAddress(const QUrl &url)
  954. {
  955. weView()->load(url);
  956. locationBar()->setText(url.toEncoded());
  957. }
  958. void QupZilla::showCookieManager()
  959. {
  960. CookieManager* m = mApp->cookieManager();
  961. m->refreshTable();
  962. m->show();
  963. }
  964. void QupZilla::showHistoryManager()
  965. {
  966. mApp->browsingLibrary()->showHistory(this);
  967. }
  968. void QupZilla::showRSSManager()
  969. {
  970. mApp->browsingLibrary()->showRSS(this);
  971. }
  972. void QupZilla::showBookmarksManager()
  973. {
  974. mApp->browsingLibrary()->showBookmarks(this);
  975. }
  976. void QupZilla::showClearPrivateData()
  977. {
  978. ClearPrivateData clear(this, this);
  979. clear.exec();
  980. }
  981. void QupZilla::showDownloadManager()
  982. {
  983. mApp->downManager()->show();
  984. }
  985. void QupZilla::showPreferences()
  986. {
  987. Preferences* prefs = new Preferences(this, this);
  988. prefs->show();
  989. }
  990. void QupZilla::showSource(QWebFrame* frame, const QString &selectedHtml)
  991. {
  992. if (!frame) {
  993. frame = weView()->page()->mainFrame();
  994. }
  995. SourceViewer* source = new SourceViewer(frame, selectedHtml);
  996. qz_centerWidgetToParent(source, this);
  997. source->show();
  998. }
  999. void QupZilla::showPageInfo()
  1000. {
  1001. SiteInfo* info = new SiteInfo(weView(), this);
  1002. info->setAttribute(Qt::WA_DeleteOnClose);
  1003. info->show();
  1004. }
  1005. void QupZilla::showBookmarksToolbar()
  1006. {
  1007. bool status = m_bookmarksToolbar->isVisible();
  1008. m_bookmarksToolbar->setVisible(!status);
  1009. Settings settings;
  1010. settings.setValue("Browser-View-Settings/showBookmarksToolbar", !status);
  1011. }
  1012. void QupZilla::showBookmarksSideBar()
  1013. {
  1014. addSideBar();
  1015. if (m_sideBar.data()->activeWidget() != SideBar::Bookmarks) {
  1016. m_sideBar.data()->showBookmarks();
  1017. }
  1018. else {
  1019. m_sideBar.data()->close();
  1020. }
  1021. }
  1022. void QupZilla::showHistorySideBar()
  1023. {
  1024. addSideBar();
  1025. if (m_sideBar.data()->activeWidget() != SideBar::History) {
  1026. m_sideBar.data()->showHistory();
  1027. }
  1028. else {
  1029. m_sideBar.data()->close();
  1030. }
  1031. }
  1032. void QupZilla::addSideBar()
  1033. {
  1034. if (m_sideBar) {
  1035. return;
  1036. }
  1037. m_sideBar = new SideBar(this);
  1038. m_mainSplitter->insertWidget(0, m_sideBar.data());
  1039. m_mainSplitter->setCollapsible(0, false);
  1040. m_mainSplitter->setSizes(QList<int>() << m_sideBarWidth << m_webViewWidth);
  1041. }
  1042. void QupZilla::saveSideBarWidth()
  1043. {
  1044. // That +1 is important here, without it, the sidebar width would
  1045. // decrease by 1 pixel every close
  1046. m_sideBarWidth = m_mainSplitter->sizes().at(0) + 1;
  1047. m_webViewWidth = width() - m_sideBarWidth;
  1048. }
  1049. void QupZilla::showNavigationToolbar()
  1050. {
  1051. if (!menuBar()->isVisible() && !m_actionShowToolbar->isChecked()) {
  1052. showMenubar();
  1053. }
  1054. bool status = m_navigationBar->isVisible();
  1055. m_navigationBar->setVisible(!status);
  1056. Settings settings;
  1057. settings.setValue("Browser-View-Settings/showNavigationToolbar", !status);
  1058. }
  1059. void QupZilla::showMenubar()
  1060. {
  1061. if (!m_navigationBar->isVisible() && !m_actionShowMenubar->isChecked()) {
  1062. showNavigationToolbar();
  1063. }
  1064. menuBar()->setVisible(!menuBar()->isVisible());
  1065. m_navigationBar->buttonSuperMenu()->setVisible(!menuBar()->isVisible());
  1066. Settings settings;
  1067. settings.setValue("Browser-View-Settings/showMenubar", menuBar()->isVisible());
  1068. }
  1069. void QupZilla::showStatusbar()
  1070. {
  1071. bool status = statusBar()->isVisible();
  1072. statusBar()->setVisible(!status);
  1073. Settings settings;
  1074. settings.setValue("Browser-View-Settings/showStatusbar", !status);
  1075. }
  1076. void QupZilla::showWebInspector()
  1077. {
  1078. #ifdef Q_WS_WIN
  1079. weView()->triggerPageAction(QWebPage::InspectElement);
  1080. #else
  1081. if (m_webInspectorDock) {
  1082. m_webInspectorDock.data()->setPage(weView()->webPage());
  1083. m_webInspectorDock.data()->show();
  1084. return;
  1085. }
  1086. m_webInspectorDock = new WebInspectorDockWidget(this);
  1087. connect(m_tabWidget, SIGNAL(currentChanged(int)), m_webInspectorDock.data(), SLOT(tabChanged()));
  1088. addDockWidget(Qt::BottomDockWidgetArea, m_webInspectorDock.data());
  1089. #endif
  1090. }
  1091. void QupZilla::showBookmarkImport()
  1092. {
  1093. BookmarksImportDialog* b = new BookmarksImportDialog(this);
  1094. b->show();
  1095. }
  1096. void QupZilla::refreshHistory()
  1097. {
  1098. m_navigationBar->refreshHistory();
  1099. }
  1100. void QupZilla::currentTabChanged()
  1101. {
  1102. TabbedWebView* view = weView();
  1103. if (!view) {
  1104. return;
  1105. }
  1106. setWindowTitle(tr("%1 - QupZilla").arg(view->title()));
  1107. m_ipLabel->setText(view->getIp());
  1108. view->setFocus();
  1109. updateLoadingActions();
  1110. // Setting correct tab order (LocationBar -> WebSearchBar -> WebView)
  1111. setTabOrder(locationBar(), m_navigationBar->searchLine());
  1112. setTabOrder(m_navigationBar->searchLine(), view);
  1113. }
  1114. void QupZilla::updateLoadingActions()
  1115. {
  1116. TabbedWebView* view = weView();
  1117. if (!view) {
  1118. return;
  1119. }
  1120. bool isLoading = view->isLoading();
  1121. m_ipLabel->setVisible(!isLoading);
  1122. m_progressBar->setVisible(isLoading);
  1123. m_actionStop->setEnabled(isLoading);
  1124. m_actionReload->setEnabled(!isLoading);
  1125. if (isLoading) {
  1126. m_progressBar->setValue(view->loadProgress());
  1127. m_navigationBar->showStopButton();
  1128. }
  1129. else {
  1130. m_navigationBar->showReloadButton();
  1131. }
  1132. }
  1133. void QupZilla::addDeleteOnCloseWidget(QWidget* widget)
  1134. {
  1135. if (!m_deleteOnCloseWidgets.contains(widget)) {
  1136. m_deleteOnCloseWidgets.append(widget);
  1137. }
  1138. }
  1139. void QupZilla::aboutQupZilla()
  1140. {
  1141. AboutDialog about(this);
  1142. about.exec();
  1143. }
  1144. void QupZilla::addTab()
  1145. {
  1146. m_tabWidget->addView(QUrl(), Qz::NT_SelectedTab, true);
  1147. }
  1148. void QupZilla::webSearch()
  1149. {
  1150. m_navigationBar->searchLine()->setFocus();
  1151. m_navigationBar->searchLine()->selectAll();
  1152. }
  1153. void QupZilla::searchOnPage()
  1154. {
  1155. if (m_mainLayout->count() == 4) {
  1156. SearchToolBar* search = qobject_cast<SearchToolBar*>(m_mainLayout->itemAt(3)->widget());
  1157. if (!search) {
  1158. return;
  1159. }
  1160. search->searchLine()->setFocus();
  1161. return;
  1162. }
  1163. SearchToolBar* search = new SearchToolBar(this);
  1164. m_mainLayout->insertWidget(3, search);
  1165. search->searchLine()->setFocus();
  1166. }
  1167. void QupZilla::openFile()
  1168. {
  1169. QString filePath = QFileDialog::getOpenFileName(this, tr("Open file..."), QDir::homePath(), "(*.html *.htm *.jpg *.png)");
  1170. if (!filePath.isEmpty()) {
  1171. loadAddress(QUrl::fromLocalFile(filePath));
  1172. }
  1173. }
  1174. void QupZilla::openLocation()
  1175. {
  1176. locationBar()->setFocus();
  1177. locationBar()->selectAll();
  1178. }
  1179. void QupZilla::showNavigationWithFullscreen()
  1180. {
  1181. bool state;
  1182. if (m_navigationVisible) {
  1183. state = !m_navigationBar->isVisible();
  1184. }
  1185. else {
  1186. state = !m_tabWidget->getTabBar()->isVisible();
  1187. }
  1188. if (m_navigationVisible) {
  1189. m_navigationBar->setVisible(state);
  1190. }
  1191. m_tabWidget->getTabBar()->updateVisibilityWithFullscreen(state);
  1192. if (m_bookmarksToolBarVisible) {
  1193. m_bookmarksToolbar->setVisible(state);
  1194. }
  1195. }
  1196. void QupZilla::fullScreen(bool make)
  1197. {
  1198. if (make) {
  1199. m_menuBarVisible = menuBar()->isVisible();
  1200. m_statusBarVisible = statusBar()->isVisible();
  1201. m_navigationVisible = m_navigationBar->isVisible();
  1202. m_bookmarksToolBarVisible = m_bookmarksToolbar->isVisible();
  1203. setWindowState(windowState() | Qt::WindowFullScreen);
  1204. menuBar()->hide();
  1205. statusBar()->hide();
  1206. bookmarksToolbar()->hide();
  1207. m_navigationBar->hide();
  1208. m_tabWidget->getTabBar()->hide();
  1209. }
  1210. else {
  1211. setWindowState(windowState() & ~Qt::WindowFullScreen);
  1212. menuBar()->setVisible(m_menuBarVisible);
  1213. statusBar()->setVisible(m_statusBarVisible);
  1214. m_bookmarksToolbar->setVisible(m_bookmarksToolBarVisible);
  1215. m_navigationBar->setVisible(m_navigationVisible);
  1216. m_tabWidget->showTabBar();
  1217. }
  1218. m_actionShowFullScreen->setChecked(make);
  1219. m_navigationBar->buttonExitFullscreen()->setVisible(make);
  1220. emit setWebViewMouseTracking(make);
  1221. }
  1222. void QupZilla::savePage()
  1223. {
  1224. QNetworkRequest request(weView()->url());
  1225. DownloadManager* dManager = mApp->downManager();
  1226. dManager->download(request, weView()->webPage(), false);
  1227. }
  1228. void QupZilla::sendLink()
  1229. {
  1230. QUrl url = QUrl("mailto:?body=" + weView()->url().toString());
  1231. QDesktopServices::openUrl(url);
  1232. }
  1233. void QupZilla::printPage(QWebFrame* frame)
  1234. {
  1235. QPrintPreviewDialog* dialog = new QPrintPreviewDialog(this);
  1236. dialog->resize(800, 750);
  1237. if (!frame) {
  1238. connect(dialog, SIGNAL(paintRequested(QPrinter*)), weView(), SLOT(print(QPrinter*)));
  1239. }
  1240. else {
  1241. connect(dialog, SIGNAL(paintRequested(QPrinter*)), frame, SLOT(print(QPrinter*)));
  1242. }
  1243. dialog->exec();
  1244. dialog->deleteLater();
  1245. }
  1246. void QupZilla::savePageScreen()
  1247. {
  1248. PageScreen* p = new PageScreen(weView(), this);
  1249. p->show();
  1250. }
  1251. void QupZilla::startPrivate(bool state)
  1252. {
  1253. static bool askedThisSession = false;
  1254. Settings settings;
  1255. bool askNow = settings.value("Browser-View-Settings/AskOnPrivate", true).toBool();
  1256. if (state && askNow && !askedThisSession) {
  1257. QString title = tr("Are you sure you want to turn on private browsing?");
  1258. QString text1 = tr("When private browsing is turned on, some actions concerning your privacy will be disabled:");
  1259. QStringList actions;
  1260. actions.append(tr("Webpages are not added to the history."));
  1261. actions.append(tr("Current cookies cannot be accessed."));
  1262. actions.append(tr("Your session is not stored."));
  1263. QString text2 = tr("Until you close the window, you can still click the Back and Forward "
  1264. "buttons to return to the webpages you have opened.");
  1265. QStr

Large files files are truncated, but you can click here to view the full file