summaryrefslogtreecommitdiff
path: root/src/mainwindow.cpp
diff options
context:
space:
mode:
authorAndrea Diamantini <adjam7@gmail.com>2008-12-27 12:54:30 +0100
committerAndrea Diamantini <adjam7@gmail.com>2008-12-27 12:54:30 +0100
commitc7048563b95f8d27b20aac0a0e1fbc5c4584c514 (patch)
treeb1513c556461a14d2e3bda6c43ce74d4d1eb5f72 /src/mainwindow.cpp
parentAdded SlackBuild (diff)
downloadrekonq-c7048563b95f8d27b20aac0a0e1fbc5c4584c514.tar.xz
BrowserMainWindow --> MainWindow
Diffstat (limited to 'src/mainwindow.cpp')
-rw-r--r--src/mainwindow.cpp862
1 files changed, 862 insertions, 0 deletions
diff --git a/src/mainwindow.cpp b/src/mainwindow.cpp
new file mode 100644
index 00000000..b57f5379
--- /dev/null
+++ b/src/mainwindow.cpp
@@ -0,0 +1,862 @@
+/* ============================================================
+ *
+ * This file is a part of the rekonq project
+ *
+ * Copyright (C) 2007-2008 Trolltech ASA. All rights reserved
+ * Copyright (C) 2008 by Andrea Diamantini <adjam7 at gmail dot com>
+ *
+ *
+ * This program is free software; you can redistribute it
+ * and/or modify it under the terms of the GNU General
+ * Public License as published by the Free Software Foundation;
+ * either version 2, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * ============================================================ */
+
+
+// Local Includes
+#include "mainwindow.h"
+#include "autosaver.h"
+#include "browserapplication.h"
+#include "downloadmanager.h"
+#include "history.h"
+#include "settings.h"
+#include "tabwidget.h"
+#include "bookmarks.h"
+#include "webview.h"
+
+// UI Includes
+#include "ui_passworddialog.h"
+
+// KDE Includes
+#include <KStatusBar>
+#include <KMenuBar>
+#include <KShortcut>
+#include <KStandardAction>
+#include <KAction>
+#include <KToggleFullScreenAction>
+#include <KActionCollection>
+#include <KMessageBox>
+#include <KFileDialog>
+
+// Qt Includes
+#include <QPlainTextEdit>
+#include <QPrintDialog>
+#include <QPrintPreviewDialog>
+#include <QPrinter>
+#include <QWebFrame>
+#include <QWebHistory>
+#include <QDebug>
+
+
+MainWindow::MainWindow(QWidget *parent, Qt::WindowFlags flags)
+ : KMainWindow(parent, flags)
+ , m_tabWidget(new TabWidget(this))
+ , m_autoSaver(new AutoSaver(this))
+ , m_historyBack(0)
+ , m_historyForward(0)
+ , m_stop(0)
+ , m_reload(0)
+{
+ // delete widget accepting close event
+ setAttribute(Qt::WA_DeleteOnClose, true);
+
+ setupMenu();
+ setupToolBar();
+
+ QWidget *centralWidget = new QWidget(this);
+
+ QVBoxLayout *layout = new QVBoxLayout;
+ layout->setSpacing(0);
+ layout->setMargin(0);
+ addToolBarBreak();
+ layout->addWidget(m_tabWidget);
+
+ // Find Bar
+ m_findBar = new FindBar(this);
+ connect( m_findBar, SIGNAL( searchString(const QString &) ), this, SLOT( slotFind(const QString &) ) );
+
+ centralWidget->setLayout(layout);
+ setCentralWidget(centralWidget);
+
+ connect(m_tabWidget, SIGNAL( loadPage(const QString &) ), this, SLOT( loadPage(const QString &) ) );
+ connect(m_tabWidget, SIGNAL( setCurrentTitle(const QString &)), this, SLOT( slotUpdateWindowTitle(const QString &) ) );
+ connect(m_tabWidget, SIGNAL( showStatusBarMessage(const QString&)), statusBar(), SLOT( showMessage(const QString&) ) );
+ connect(m_tabWidget, SIGNAL( linkHovered(const QString&)), statusBar(), SLOT( showMessage(const QString&) ) );
+ connect(m_tabWidget, SIGNAL( loadProgress(int)), this, SLOT( slotLoadProgress(int) ) );
+ connect(m_tabWidget, SIGNAL( tabsChanged()), m_autoSaver, SLOT( changeOccurred() ) );
+ connect(m_tabWidget, SIGNAL( geometryChangeRequested(const QRect &)), this, SLOT( geometryChangeRequested(const QRect &) ) );
+ connect(m_tabWidget, SIGNAL( printRequested(QWebFrame *)), this, SLOT( printRequested(QWebFrame *) ) );
+ connect(m_tabWidget, SIGNAL( menuBarVisibilityChangeRequested(bool)), menuBar(), SLOT( setVisible(bool) ) );
+ connect(m_tabWidget, SIGNAL( statusBarVisibilityChangeRequested(bool)), statusBar(), SLOT( setVisible(bool) ) );
+ connect(m_tabWidget, SIGNAL( toolBarVisibilityChangeRequested(bool) ), m_navigationBar, SLOT( setVisible(bool) ) );
+ connect(m_tabWidget, SIGNAL( lastTabClosed() ), m_tabWidget, SLOT(newTab() ) );
+
+ slotUpdateWindowTitle();
+ loadDefaultState();
+ m_tabWidget->newTab();
+}
+
+
+MainWindow::~MainWindow()
+{
+ m_autoSaver->changeOccurred();
+ m_autoSaver->saveIfNeccessary();
+ delete m_navigationBar;
+}
+
+
+void MainWindow::loadDefaultState()
+{
+ KConfig config("rekonqrc");
+ KConfigGroup group1 = config.group("MainWindow");
+ QByteArray data = group1.readEntry(QString("defaultState"), QByteArray() );
+ restoreState(data);
+}
+
+
+void MainWindow::save()
+{
+ BrowserApplication::instance()->saveSession();
+
+ KConfig config("rekonqrc");
+ KConfigGroup group1 = config.group("MainWindow");
+ QByteArray data = saveState();
+ group1.writeEntry( QString("defaultState"), data );
+
+ KConfigGroup group2 = config.group("navigation toobar");
+ m_navigationBar->saveSettings( group2 );
+}
+
+
+static const qint32 MainWindowMagic = 0xba;
+
+
+QByteArray MainWindow::saveState() const
+{
+ int version = 2;
+ QByteArray data;
+ QDataStream stream(&data, QIODevice::WriteOnly);
+
+ stream << qint32(MainWindowMagic);
+ stream << qint32(version);
+
+ stream << size();
+
+ stream << KToolBar::toolBarsLocked();
+ bool b = true; // statusBar()->isVisible() ; FIXME
+ stream << b;
+ stream << QByteArray();
+ return data;
+}
+
+
+
+void MainWindow::restoreState(const QByteArray &state)
+{
+ int version = 2;
+ QByteArray sd = state;
+ QDataStream stream(&sd, QIODevice::ReadOnly);
+ if ( stream.atEnd() )
+ {
+ return;
+ }
+
+ qint32 marker;
+ qint32 v;
+ stream >> marker;
+ stream >> v;
+ if (marker != MainWindowMagic || v != version)
+ {
+ return;
+ }
+
+ QSize size;
+ bool showStatusbar;
+ bool toolbarsLocked;
+ QByteArray tabState;
+
+ stream >> size;
+ stream >> toolbarsLocked;
+ stream >> showStatusbar;
+
+ resize(size);
+ statusBar()->setVisible(showStatusbar);
+ updateStatusbarActionText(showStatusbar);
+
+ KToolBar::setToolBarsLocked ( toolbarsLocked );
+ return;
+}
+
+
+void MainWindow::setupMenu()
+{
+ // ------------------------------------------------------------- FILE --------------------------------------------------------------------------------------------------
+ KMenu *fileMenu = (KMenu *) menuBar()->addMenu( i18n("&File") );
+
+ fileMenu->addAction( KStandardAction::openNew(this, SLOT( slotFileNew() ) , this ) );
+ fileMenu->addAction( KStandardAction::open( this, SLOT( slotFileOpen() ), this ) );
+ fileMenu->addAction( i18n("Open Location"), this, SLOT( slotSelectLineEdit() ) );
+ fileMenu->addSeparator();
+
+ fileMenu->addAction( m_tabWidget->newTabAction() );
+ fileMenu->addAction( m_tabWidget->closeTabAction() );
+ fileMenu->addSeparator();
+
+ fileMenu->addAction( KStandardAction::saveAs( this, SLOT( slotFileSaveAs() ), this ) );
+ fileMenu->addSeparator();
+
+ fileMenu->addAction( KStandardAction::printPreview( this, SLOT( slotFilePrintPreview() ), this ) );
+ fileMenu->addAction( KStandardAction::print( this, SLOT(slotFilePrint()), this) );
+ fileMenu->addSeparator();
+
+ KAction *action = (KAction *) fileMenu->addAction( i18n("Private &Browsing..."), this, SLOT( slotPrivateBrowsing() ) );
+ action->setCheckable(true);
+ fileMenu->addSeparator();
+
+ fileMenu->addAction( KStandardAction::quit( this , SLOT( close() ), this ) );
+
+ // ------------------------------------------------------------- EDIT --------------------------------------------------------------------------------------------------
+ KMenu *editMenu = (KMenu *) menuBar()->addMenu( i18n("&Edit") );
+
+ KAction *m_undo = KStandardAction::undo( this , 0 , this );
+ editMenu->addAction( m_undo );
+ m_tabWidget->addWebAction(m_undo, QWebPage::Undo);
+
+ KAction *m_redo = KStandardAction::redo( this , 0 , this );
+ editMenu->addAction( m_redo );
+ m_tabWidget->addWebAction(m_redo, QWebPage::Redo);
+
+ editMenu->addSeparator();
+
+ KAction *m_cut = KStandardAction::cut( this , 0 , this );
+ editMenu->addAction( m_cut );
+ m_tabWidget->addWebAction(m_cut, QWebPage::Cut);
+
+ KAction *m_copy = KStandardAction::copy( this , 0 , this );
+ editMenu->addAction( m_copy );
+ m_tabWidget->addWebAction(m_copy, QWebPage::Copy);
+
+ KAction *m_paste = KStandardAction::paste( this , 0 , this );
+ editMenu->addAction( m_paste );
+ m_tabWidget->addWebAction(m_paste, QWebPage::Paste);
+
+ editMenu->addSeparator();
+
+ KAction *m_selectall = KStandardAction::selectAll( this , 0 , this );
+ editMenu->addAction( m_selectall );
+ m_tabWidget->addWebAction(m_selectall, QWebPage::SelectEndOfDocument );
+
+ editMenu->addSeparator();
+
+ editMenu->addAction( KStandardAction::find(this, SLOT( slotViewFindBar() ) , this ) );
+ editMenu->addAction( KStandardAction::findNext(this, SLOT( slotFindNext() ) , this ) );
+ editMenu->addAction( KStandardAction::findPrev(this, SLOT( slotFindPrevious() ) , this ) );
+
+ // ------------------------------------------------------------- VIEW -------------------------------------------------------------------------------------------------
+ KMenu *viewMenu = (KMenu *) menuBar()->addMenu( i18n("&View") );
+
+ m_viewStatusbar = KStandardAction::showStatusbar( this, SLOT(slotViewStatusbar() ), this);
+ viewMenu->addAction(m_viewStatusbar);
+
+ viewMenu->addSeparator();
+
+ m_stop = (KAction *) viewMenu->addAction( KIcon( "process-stop" ), i18n("&Stop") );
+ m_stop->setShortcut( QKeySequence(Qt::CTRL | Qt::Key_Period) );
+ m_tabWidget->addWebAction(m_stop, QWebPage::Stop);
+
+ m_reload = (KAction *) viewMenu->addAction( KIcon("view-refresh"), i18n("Reload Page") );
+ m_reload->setShortcut(QKeySequence::Refresh);
+ m_tabWidget->addWebAction(m_reload, QWebPage::Reload);
+
+ viewMenu->addSeparator();
+
+ KMenu *fontMenu = new KMenu( i18n("Make Text..."), this );
+ fontMenu->addAction( i18n("&Bigger"), this, SLOT(slotViewTextBigger()), QKeySequence(Qt::CTRL | Qt::Key_Plus));
+ fontMenu->addAction( i18n("&Normal"), this, SLOT(slotViewTextNormal()), QKeySequence(Qt::CTRL | Qt::Key_0));
+ fontMenu->addAction( i18n("&Smaller"), this, SLOT(slotViewTextSmaller()), QKeySequence(Qt::CTRL | Qt::Key_Minus));
+
+ viewMenu->addMenu( fontMenu );
+
+ viewMenu->addSeparator();
+
+ // TODO set encoding
+
+ viewMenu->addAction( i18n("Page S&ource"), this, SLOT( slotViewPageSource() ), i18n("Ctrl+Alt+U"));
+
+ KToggleFullScreenAction *tfsa = KStandardAction::fullScreen( this, SLOT( slotViewFullScreen(bool) ), this, this);
+ viewMenu->addAction( tfsa );
+
+ // ------------------------------------------------------------- HISTORY --------------------------------------------------------------------------------------------------
+ HistoryMenu *historyMenu = new HistoryMenu(this);
+ connect(historyMenu, SIGNAL(openUrl(const KUrl&)), m_tabWidget, SLOT(loadUrlInCurrentTab(const KUrl&)));
+ connect(historyMenu, SIGNAL(hovered(const QString&)), this, SLOT(slotUpdateStatusbar(const QString&)));
+ historyMenu->setTitle( i18n("Hi&story") );
+ menuBar()->addMenu(historyMenu);
+ QList<KAction*> historyActions;
+
+ m_historyBack = new KAction( i18n("Back"), this);
+ m_historyBack->setShortcut( KShortcut( QKeySequence::Back ) );
+ m_tabWidget->addWebAction( m_historyBack, QWebPage::Back );
+ m_historyBack->setIconVisibleInMenu(false);
+
+ m_historyForward = new KAction( i18n("Forward"), this);
+ m_historyForward->setShortcut( KShortcut( QKeySequence::Forward ) );
+ m_tabWidget->addWebAction( m_historyForward, QWebPage::Forward );
+ m_historyForward->setIconVisibleInMenu(false);
+
+ historyActions.append( m_historyBack );
+ historyActions.append( m_historyForward );
+ historyActions.append( KStandardAction::home(this, SLOT( slotHome() ) , this ) );
+ historyActions.append( m_tabWidget->recentlyClosedTabsAction() );
+
+ historyMenu->setInitialActions(historyActions);
+
+
+
+ // ------------------------------------------------------------- BOOKMARKS --------------------------------------------------------------------------------------------------
+
+ BookmarksMenu *bookmarksMenu = new BookmarksMenu( this );
+ bookmarksMenu->setTitle( i18n("&Bookmarks") );
+ menuBar()->addMenu( bookmarksMenu );
+
+ // ------------------------------------------------------------- TOOLS ------------------------------------------------------------------------------------------------------
+ KMenu* toolsMenu = (KMenu *) menuBar()->addMenu( i18n("&Tools") );
+
+ toolsMenu->addAction( i18n("Downloads"), this, SLOT( slotDownloadManager() ), i18n("Alt+Ctrl+D") );
+
+ toolsMenu->addSeparator();
+
+ action = (KAction *) toolsMenu->addAction( i18n("Enable Web &Inspector"), this, SLOT(slotToggleInspector(bool)));
+ action->setCheckable(true);
+
+ // ------------------------------------------------------------- SETTINGS ------------------------------------------------------------------------------------------------------
+ KMenu *settingsMenu = (KMenu *) menuBar()->addMenu( i18n("&Settings") );
+
+ settingsMenu->addAction( KStandardAction::keyBindings( this, SLOT( configureShortcuts() ), this ) ); //FIXME need new slot and actionCollection !!
+ settingsMenu->addAction( KStandardAction::preferences(this, SLOT( slotPreferences() ) , this ) );
+
+ // ------------------------------------------------------------- HELP --------------------------------------------------------------------------------------------------
+ menuBar()->addMenu( helpMenu() );
+}
+
+
+void MainWindow::setupToolBar()
+{
+ m_navigationBar = new KToolBar( i18n("Navigation") , this, Qt::TopToolBarArea, false, false, true);
+
+ m_historyBack = new KAction( KIcon("go-previous"), i18n("Back"), this);
+ m_historyBackMenu = new KMenu(this);
+ m_historyBack->setMenu(m_historyBackMenu);
+ connect(m_historyBack, SIGNAL( triggered() ), this, SLOT( slotOpenPrevious() ) );
+ connect(m_historyBackMenu, SIGNAL(aboutToShow()), this, SLOT(slotAboutToShowBackMenu()));
+ connect(m_historyBackMenu, SIGNAL(triggered(QAction *)), this, SLOT(slotOpenActionUrl(QAction *)));
+ m_navigationBar->addAction(m_historyBack);
+
+ m_historyForward = new KAction( KIcon("go-next"), i18n("Forward"), this );
+ connect(m_historyForward, SIGNAL( triggered() ), this, SLOT( slotOpenNext() ) );
+ m_navigationBar->addAction(m_historyForward);
+
+ m_stopReload = new KAction( KIcon("view-refresh"), i18n("Reload"), this);
+ m_navigationBar->addAction(m_stopReload);
+
+ m_goHome = new KAction( KIcon( "go-home" ), i18n("Home"),this);
+ m_navigationBar->addAction(m_goHome);
+ connect(m_goHome, SIGNAL(triggered()), this, SLOT(slotHome()));
+
+ m_navigationBar->addWidget( m_tabWidget->lineEditStack() );
+
+ m_searchBar = new SearchBar( m_navigationBar );
+ connect(m_searchBar, SIGNAL(search(const KUrl&)), this, SLOT(loadUrl(const KUrl&)));
+ m_navigationBar->addWidget(m_searchBar);
+
+ // UI settings
+ setContextMenuPolicy( Qt::PreventContextMenu );
+
+ // setting initial style (if user hasn't decided something else)
+ m_navigationBar->setIconDimensions(22);
+ m_navigationBar->setToolButtonStyle( Qt::ToolButtonIconOnly );
+
+ KConfig config("rekonqrc");
+ KConfigGroup group = config.group("navigation toobar");
+ if ( group.exists() )
+ {
+ m_navigationBar->applySettings( group );
+ }
+}
+
+
+void MainWindow::updateStatusbarActionText(bool visible)
+{
+ m_viewStatusbar->setText(!visible ? i18n("Show Status Bar") : i18n("Hide Status Bar"));
+}
+
+
+void MainWindow::slotViewStatusbar()
+{
+ if (statusBar()->isVisible())
+ {
+ updateStatusbarActionText(false);
+ statusBar()->close();
+ }
+ else
+ {
+ updateStatusbarActionText(true);
+ statusBar()->show();
+ }
+ m_autoSaver->changeOccurred();
+}
+
+
+KUrl MainWindow::guessUrlFromString(const QString &string)
+{
+ QString urlStr = string.trimmed();
+ QRegExp test(QLatin1String("^[a-zA-Z]+\\:.*"));
+
+ // Check if it looks like a qualified URL. Try parsing it and see.
+ bool hasSchema = test.exactMatch(urlStr);
+ if (hasSchema)
+ {
+ QUrl qurl(urlStr, QUrl::TolerantMode);
+ KUrl url(qurl);
+ if ( url.isValid() )
+ {
+ return url;
+ }
+ }
+
+ // Might be a file.
+ if (QFile::exists(urlStr))
+ {
+ QFileInfo info(urlStr);
+ return KUrl::fromPath( info.absoluteFilePath() );
+ }
+
+ // Might be a shorturl - try to detect the schema.
+ if (!hasSchema)
+ {
+ int dotIndex = urlStr.indexOf(QLatin1Char('.'));
+ if (dotIndex != -1)
+ {
+ QString prefix = urlStr.left(dotIndex).toLower();
+ QString schema = (prefix == QLatin1String("ftp")) ? prefix : QLatin1String("http");
+ QUrl qurl(schema + QLatin1String("://") + urlStr, QUrl::TolerantMode);
+ KUrl url(qurl);
+ if ( url.isValid() )
+ {
+ return url;
+ }
+ }
+ }
+
+ // Fall back to QUrl's own tolerant parser.
+ QUrl qurl = QUrl(string, QUrl::TolerantMode);
+ KUrl url(qurl);
+
+ // finally for cases where the user just types in a hostname add http
+ if ( qurl.scheme().isEmpty() )
+ {
+ qurl = QUrl(QLatin1String("http://") + string, QUrl::TolerantMode);
+ url = KUrl(qurl);
+ }
+ return url;
+}
+
+
+void MainWindow::loadUrl(const KUrl &url)
+{
+ loadPage( url.url() );
+}
+
+
+void MainWindow::slotDownloadManager()
+{
+ BrowserApplication::downloadManager()->show();
+}
+
+
+void MainWindow::slotSelectLineEdit()
+{
+ m_tabWidget->currentLineEdit()->selectAll();
+ m_tabWidget->currentLineEdit()->setFocus();
+}
+
+
+void MainWindow::slotFileSaveAs()
+{
+ BrowserApplication::downloadManager()->download(currentTab()->url(), true);
+}
+
+
+void MainWindow::slotPreferences()
+{
+ SettingsDialog *s = new SettingsDialog(this);
+ s->show();
+}
+
+
+void MainWindow::slotUpdateStatusbar(const QString &string)
+{
+ statusBar()->showMessage(string, 2000);
+}
+
+
+void MainWindow::slotUpdateWindowTitle(const QString &title)
+{
+ if (title.isEmpty())
+ {
+ setWindowTitle("rekonq");
+ }
+ else
+ {
+ setWindowTitle(title + " - rekonq");
+ }
+}
+
+
+void MainWindow::slotFileNew()
+{
+ BrowserApplication::instance()->newMainWindow();
+ MainWindow *mw = BrowserApplication::instance()->mainWindow();
+ mw->slotHome();
+}
+
+
+void MainWindow::slotFileOpen()
+{
+ QString file = KFileDialog::getOpenFileName( KUrl(),
+ i18n("Web Resources (*.html *.htm *.svg *.png *.gif *.svgz);;All files (*.*)"),
+ this,
+ i18n("Open Web Resource") );
+
+ if (file.isEmpty())
+ return;
+
+ loadPage(file);
+}
+
+
+void MainWindow::slotFilePrintPreview()
+{
+ if (!currentTab())
+ return;
+ QPrintPreviewDialog *dialog = new QPrintPreviewDialog(this);
+ connect(dialog, SIGNAL(paintRequested(QPrinter *)), currentTab(), SLOT(print(QPrinter *)));
+ dialog->exec();
+}
+
+
+void MainWindow::slotFilePrint()
+{
+ if (!currentTab())
+ return;
+ printRequested(currentTab()->page()->mainFrame());
+}
+
+
+void MainWindow::printRequested(QWebFrame *frame)
+{
+ QPrinter printer;
+ QPrintDialog *dialog = new QPrintDialog(&printer, this);
+ dialog->setWindowTitle( i18n("Print Document") );
+ if (dialog->exec() != QDialog::Accepted )
+ return;
+ frame->print(&printer);
+}
+
+
+void MainWindow::slotPrivateBrowsing()
+{
+ QWebSettings *settings = QWebSettings::globalSettings();
+ bool pb = settings->testAttribute(QWebSettings::PrivateBrowsingEnabled);
+ if (!pb)
+ {
+ QString title = i18n("Are you sure you want to turn on private browsing?");
+ QString text = "<b>" + title + i18n("</b><br><br>When private browsing in turned on,"
+ " webpages are not added to the history,"
+ " items are automatically removed from the Downloads window," \
+ " new cookies are not stored, current cookies can't be accessed," \
+ " site icons wont be stored, session wont be saved, " \
+ " and searches are not addded to the pop-up menu in the Google search box." \
+ " Until you close the window, you can still click the Back and Forward buttons" \
+ " to return to the webpages you have opened.");
+
+ int button = KMessageBox::questionYesNo( this, text, title );
+ if (button == KMessageBox::Ok)
+ {
+ settings->setAttribute(QWebSettings::PrivateBrowsingEnabled, true);
+ }
+ }
+ else
+ {
+ settings->setAttribute(QWebSettings::PrivateBrowsingEnabled, false);
+
+ QList<MainWindow*> windows = BrowserApplication::instance()->mainWindows();
+ for (int i = 0; i < windows.count(); ++i)
+ {
+ MainWindow *window = windows.at(i);
+ window->m_lastSearch = QString::null;
+ window->tabWidget()->clear();
+ }
+ }
+}
+
+
+void MainWindow::closeEvent(QCloseEvent *event)
+{
+ if (m_tabWidget->count() > 1)
+ {
+ int ret = KMessageBox::warningYesNo(this,
+ i18n("Are you sure you want to close the window?" " There are %1 tab open" , m_tabWidget->count() ) ,
+ i18n("Closing") );
+ if (ret == KMessageBox::No)
+ {
+ event->ignore();
+ return;
+ }
+ }
+ event->accept();
+ deleteLater();
+}
+
+
+void MainWindow::slotFind(const QString & search)
+{
+ if (!currentTab())
+ return;
+ if (!search.isEmpty())
+ {
+ m_lastSearch = search;
+ if (!currentTab()->findText(m_lastSearch))
+ slotUpdateStatusbar( QString(m_lastSearch) + i18n(" not found.") );
+ }
+}
+
+
+void MainWindow::slotViewFindBar()
+{
+ m_findBar->showFindBar();
+}
+
+
+void MainWindow::slotFindNext()
+{
+ if (!currentTab() && !m_lastSearch.isEmpty())
+ return;
+ currentTab()->findText(m_lastSearch);
+}
+
+
+void MainWindow::slotFindPrevious()
+{
+ if (!currentTab() && !m_lastSearch.isEmpty())
+ return;
+ currentTab()->findText(m_lastSearch, QWebPage::FindBackward);
+}
+
+
+void MainWindow::slotViewTextBigger()
+{
+ if (!currentTab())
+ return;
+ currentTab()->setTextSizeMultiplier(currentTab()->textSizeMultiplier() + 0.1);
+}
+
+
+void MainWindow::slotViewTextNormal()
+{
+ if (!currentTab())
+ return;
+ currentTab()->setTextSizeMultiplier(1.0);
+}
+
+
+void MainWindow::slotViewTextSmaller()
+{
+ if (!currentTab())
+ return;
+ currentTab()->setTextSizeMultiplier(currentTab()->textSizeMultiplier() - 0.1);
+}
+
+
+// TODO improve this
+void MainWindow::slotViewFullScreen(bool makeFullScreen)
+{
+ KToggleFullScreenAction::setFullScreen( this, makeFullScreen );
+}
+
+
+void MainWindow::slotViewPageSource()
+{
+ if (!currentTab())
+ return;
+
+ QString markup = currentTab()->page()->mainFrame()->toHtml();
+ QPlainTextEdit *view = new QPlainTextEdit(markup);
+ view->setWindowTitle( i18n("Page Source of ") + currentTab()->title() );
+ view->setMinimumWidth(640);
+ view->setAttribute(Qt::WA_DeleteOnClose);
+ view->show();
+}
+
+
+void MainWindow::slotHome()
+{
+ KConfig config("rekonqrc");
+ KConfigGroup group = config.group("Global Settings");
+ QString home = group.readEntry( QString("home"), QString("http://www.kde.org/") );
+ loadPage(home);
+}
+
+
+void MainWindow::slotToggleInspector(bool enable)
+{
+ QWebSettings::globalSettings()->setAttribute(QWebSettings::DeveloperExtrasEnabled, enable);
+ if (enable)
+ {
+ int result = KMessageBox::questionYesNo(this,
+ i18n("The web inspector will only work correctly for pages that were loaded after enabling.\n"
+ "Do you want to reload all pages?"),
+ i18n("Web Inspector") );
+ if (result == KMessageBox::Yes)
+ {
+ m_tabWidget->reloadAllTabs();
+ }
+ }
+}
+
+
+void MainWindow::slotSwapFocus()
+{
+ if (currentTab()->hasFocus())
+ m_tabWidget->currentLineEdit()->setFocus();
+ else
+ currentTab()->setFocus();
+}
+
+
+void MainWindow::loadPage(const QString &page)
+{
+ if (!currentTab() || page.isEmpty())
+ return;
+
+ KUrl url = guessUrlFromString(page);
+ m_tabWidget->currentLineEdit()->setText( url.prettyUrl() );
+ m_tabWidget->loadUrlInCurrentTab(url);
+}
+
+
+TabWidget *MainWindow::tabWidget() const
+{
+ return m_tabWidget;
+}
+
+
+
+WebView *MainWindow::currentTab() const
+{
+ return m_tabWidget->currentWebView();
+}
+
+
+void MainWindow::slotLoadProgress(int progress)
+{
+ if (progress < 100 && progress > 0)
+ {
+ disconnect(m_stopReload, SIGNAL(triggered()), m_reload, SLOT(trigger()));
+ if (m_stopIcon.isNull())
+ m_stopIcon = KIcon( "process-stop" );
+ m_stopReload->setIcon(m_stopIcon);
+ connect(m_stopReload, SIGNAL(triggered()), m_stop, SLOT(trigger()));
+ m_stopReload->setToolTip( i18n("Stop loading the current page") );
+ }
+ else
+ {
+ disconnect(m_stopReload, SIGNAL(triggered()), m_stop, SLOT(trigger()));
+ m_stopReload->setIcon( KIcon("view-refresh") );
+ connect(m_stopReload, SIGNAL(triggered()), m_reload, SLOT(trigger()));
+ m_stopReload->setToolTip( i18n("Reload the current page") );
+ }
+}
+
+
+void MainWindow::slotAboutToShowBackMenu()
+{
+ m_historyBackMenu->clear();
+ if (!currentTab())
+ return;
+ QWebHistory *history = currentTab()->history();
+ int historyCount = history->count();
+ for (int i = history->backItems(historyCount).count() - 1; i >= 0; --i)
+ {
+ QWebHistoryItem item = history->backItems(history->count()).at(i);
+ KAction *action = new KAction(this);
+ action->setData(-1*(historyCount-i-1));
+ QIcon icon = BrowserApplication::instance()->icon(item.url());
+ action->setIcon(icon);
+ action->setText(item.title());
+ m_historyBackMenu->addAction(action);
+ }
+}
+
+
+void MainWindow::slotShowWindow()
+{
+ if (KAction *action = qobject_cast<KAction*>(sender()))
+ {
+ QVariant v = action->data();
+ if (v.canConvert<int>())
+ {
+ int offset = qvariant_cast<int>(v);
+ QList<MainWindow*> windows = BrowserApplication::instance()->mainWindows();
+ windows.at(offset)->activateWindow();
+ windows.at(offset)->currentTab()->setFocus();
+ }
+ }
+}
+
+
+void MainWindow::slotOpenActionUrl(QAction *action)
+{
+ int offset = action->data().toInt();
+ QWebHistory *history = currentTab()->history();
+ if (offset < 0)
+ {
+ history->goToItem(history->backItems(-1*offset).first()); // back
+ }
+ else
+ {
+ if (offset > 0)
+ {
+ history->goToItem(history->forwardItems(history->count() - offset + 1).back()); // forward
+ }
+ }
+}
+
+
+void MainWindow::slotOpenPrevious()
+{
+ QWebHistory *history = currentTab()->history();
+ if ( history->canGoBack() )
+ history->goToItem( history->backItem() );
+}
+
+
+void MainWindow::slotOpenNext()
+{
+ QWebHistory *history = currentTab()->history();
+ if ( history->canGoForward() )
+ history->goToItem( history->forwardItem() );
+}
+
+
+void MainWindow::geometryChangeRequested(const QRect &geometry)
+{
+ setGeometry(geometry);
+}
+