diff options
Diffstat (limited to 'src/webview.cpp')
-rw-r--r-- | src/webview.cpp | 302 |
1 files changed, 206 insertions, 96 deletions
diff --git a/src/webview.cpp b/src/webview.cpp index 3936ed3c..e7226740 100644 --- a/src/webview.cpp +++ b/src/webview.cpp @@ -2,8 +2,8 @@ * * This file is a part of the rekonq project * -* Copyright (C) 2008-2009 by Andrea Diamantini <adjam7 at gmail dot com> -* Copyright (C) 2009 by Lionel Chauvin <megabigbug@yahoo.fr> +* Copyright (C) 2008-2010 by Andrea Diamantini <adjam7 at gmail dot com> +* Copyright (C) 2009-2010 by Lionel Chauvin <megabigbug@yahoo.fr> * * * This program is free software; you can redistribute it and/or @@ -11,9 +11,9 @@ * published by the Free Software Foundation; either version 2 of * the License or (at your option) version 3 or any later version * accepted by the membership of KDE e.V. (or its successor approved -* by the membership of KDE e.V.), which shall act as a proxy +* by the membership of KDE e.V.), which shall act as a proxy * defined in Section 14 of version 3 of the license. -* +* * 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 @@ -37,6 +37,7 @@ #include "mainview.h" #include "webpage.h" #include "bookmarksmanager.h" +#include "searchengine.h" // KDE Includes #include <KService> @@ -47,45 +48,64 @@ #include <ktoolinvocation.h> // Qt Includes -#include <QContextMenuEvent> -#include <QWheelEvent> -#include <QMouseEvent> -#include <QClipboard> -#include <QKeyEvent> -#include <QAction> -#include <QLayout> +#include <QtCore/QDir> + +#include <QtGui/QAction> +#include <QtGui/QContextMenuEvent> +#include <QtGui/QWheelEvent> +#include <QtGui/QMouseEvent> +#include <QtGui/QClipboard> +#include <QtGui/QKeyEvent> +#include <QtGui/QLayout> + #include <QtDBus/QDBusConnectionInterface> #include <QtDBus/QDBusInterface> #include <QtDBus/QDBusReply> -#include <QDir> WebView::WebView(QWidget* parent) - : KWebView(parent, false) - , m_page( new WebPage(this) ) - , m_mousePos(QPoint(0,0)) + : KWebView(parent, false) + , _mousePos(QPoint(0, 0)) + , _scrollTimer(new QTimer(this)) + , _VScrollSpeed(0) + , _HScrollSpeed(0) + , _canEnableAutoScroll(true) + , _isAutoScrollEnabled(false) { - setPage(m_page); + WebPage *page = new WebPage(this); + setPage(page); // download system - connect(this, SIGNAL(linkShiftClicked(const KUrl &)), - m_page, SLOT(downloadUrl(const KUrl &))); - connect(m_page, SIGNAL(downloadRequested(const QNetworkRequest &)), - m_page, SLOT(downloadRequest(const QNetworkRequest &))); - + connect(this, SIGNAL(linkShiftClicked(const KUrl &)), + page, SLOT(downloadUrl(const KUrl &))); + connect(page, SIGNAL(downloadRequested(const QNetworkRequest &)), + page, SLOT(downloadRequest(const QNetworkRequest &))); + // middle click || ctrl + click signal - connect(this, SIGNAL(linkMiddleOrCtrlClicked(const KUrl &)), - this, SLOT(loadUrlInNewTab(const KUrl &)) ); + connect(this, SIGNAL(linkMiddleOrCtrlClicked(const KUrl &)), + this, SLOT(loadUrlInNewTab(const KUrl &))); // loadUrl signal - connect(this, SIGNAL(loadUrl(const KUrl &, const Rekonq::OpenType &)), + connect(this, SIGNAL(loadUrl(const KUrl &, const Rekonq::OpenType &)), Application::instance(), SLOT(loadUrl(const KUrl &, const Rekonq::OpenType &))); + + // scrolling timer + connect(_scrollTimer, SIGNAL(timeout()), this, SLOT(scrollFrameChanged())); + _scrollTimer->setInterval(100); } WebView::~WebView() { - disconnect(); + delete _scrollTimer; + disconnect(); +} + + +WebPage *WebView::page() +{ + WebPage *page = qobject_cast<WebPage *>(KWebView::page()); + return page; } @@ -111,7 +131,7 @@ void WebView::contextMenuEvent(QContextMenuEvent *event) connect(a, SIGNAL(triggered(bool)), this, SLOT(openLinkInNewWindow())); menu.addAction(a); - menu.addAction(pageAction(KWebPage::DownloadLinkToDisk)); + menu.addAction(pageAction(KWebPage::DownloadLinkToDisk)); menu.addAction(pageAction(KWebPage::CopyLinkToClipboard)); menu.addSeparator(); } @@ -124,10 +144,10 @@ void WebView::contextMenuEvent(QContextMenuEvent *event) } // is content selected) Add COPY - if(result.isContentSelected()) + if (result.isContentSelected()) { a = pageAction(KWebPage::Copy); - if(!result.linkUrl().isEmpty()) + if (!result.linkUrl().isEmpty()) a->setText(i18n("Copy Text")); //for link else a->setText(i18n("Copy")); @@ -135,41 +155,23 @@ void WebView::contextMenuEvent(QContextMenuEvent *event) } // is content editable? Add PASTE - if(result.isContentEditable()) + if (result.isContentEditable()) { menu.addAction(pageAction(KWebPage::Paste)); } // is content selected? Add SEARCH actions - if(result.isContentSelected()) + if (result.isContentSelected()) { KActionMenu *searchMenu = new KActionMenu(KIcon("edit-find"), i18n("Search with"), this); - KConfig config("kuriikwsfilterrc"); //Share with konqueror - KConfigGroup cg = config.group("General"); - QStringList favoriteEngines; - favoriteEngines << "wikipedia" << "google"; //defaults - favoriteEngines = cg.readEntry("FavoriteSearchEngines", favoriteEngines); - QString keywordDelimiter = cg.readEntry("KeywordDelimiter", ":"); - KService::Ptr service; - KUriFilterData data; - - Q_FOREACH(const QString &engine, favoriteEngines) + foreach(KService::Ptr engine, SearchEngine::favorites()) { - if(!engine.isEmpty()) - { - service = KService::serviceByDesktopPath(QString("searchproviders/%1.desktop").arg(engine)); - if(service) - { - const QString searchProviderPrefix = *(service->property("Keys").toStringList().begin()) + keywordDelimiter; - data.setData(searchProviderPrefix + "some keyword"); - a = new KAction(service->name(), this); - a->setIcon(Application::icon(KUrl(data.uri()))); - a->setData(searchProviderPrefix); - connect(a, SIGNAL(triggered(bool)), this, SLOT(search())); - searchMenu->addAction(a); - } - } + a = new KAction(engine->name(), this); + a->setIcon(Application::icon(SearchEngine::buildQuery(engine, ""))); + a->setData(engine->entryPath()); + connect(a, SIGNAL(triggered(bool)), this, SLOT(search())); + searchMenu->addAction(a); } if (!searchMenu->menu()->isEmpty()) @@ -178,7 +180,7 @@ void WebView::contextMenuEvent(QContextMenuEvent *event) } menu.addSeparator(); - // TODO Add translate, show translation + // TODO Add translate, show translation } // is an image? @@ -186,7 +188,7 @@ void WebView::contextMenuEvent(QContextMenuEvent *event) { menu.addSeparator(); - // TODO remove copy_this_image action + // TODO remove copy_this_image action a = new KAction(KIcon("view-media-visualization"), i18n("&View Image"), this); a->setData(result.imageUrl()); connect(a, SIGNAL(triggered(Qt::MouseButtons, Qt::KeyboardModifiers)), this, SLOT(viewImage(Qt::MouseButtons, Qt::KeyboardModifiers))); @@ -198,13 +200,13 @@ void WebView::contextMenuEvent(QContextMenuEvent *event) } // Open url text in new tab/window - if(result.linkUrl().isEmpty()) + if (result.linkUrl().isEmpty()) { - QString text = selectedText(); - if (text.startsWith( QLatin1String("http://") ) - || text.startsWith( QLatin1String("https://") ) - || text.startsWith( QLatin1String("www.") ) + QString text = selectedText(); + if (text.startsWith(QL1S("http://")) + || text.startsWith(QL1S("https://")) + || text.startsWith(QL1S("www.")) ) { QString truncatedURL = text; @@ -237,23 +239,23 @@ void WebView::contextMenuEvent(QContextMenuEvent *event) // navigation QWebHistory *history = page()->history(); - if(history->canGoBack()) + if (history->canGoBack()) { menu.addAction(pageAction(KWebPage::Back)); } - if(history->canGoForward()) + if (history->canGoForward()) { menu.addAction(pageAction(KWebPage::Forward)); } menu.addAction(mainwindow->actionByName("view_redisplay")); - if( result.pixmap().isNull() ) + if (result.pixmap().isNull()) { menu.addSeparator(); - menu.addAction(mainwindow->actionByName("new_tab")); + menu.addAction(mainwindow->actionByName("new_tab")); menu.addAction(mainwindow->actionByName("new_window")); menu.addSeparator(); @@ -263,14 +265,14 @@ void WebView::contextMenuEvent(QContextMenuEvent *event) frameMenu->addAction(pageAction(KWebPage::OpenFrameInNewWindow)); - a = new KAction( KIcon("document-print-frame"), i18n("Print Frame"), this); + a = new KAction(KIcon("document-print-frame"), i18n("Print Frame"), this); connect(a, SIGNAL(triggered()), this, SLOT(printFrame())); frameMenu->addAction(a); menu.addAction(frameMenu); - + menu.addSeparator(); - + // Page Actions menu.addAction(pageAction(KWebPage::SelectAll)); @@ -278,22 +280,22 @@ void WebView::contextMenuEvent(QContextMenuEvent *event) if (ReKonfig::kgetList()) { - a = new KAction(KIcon("kget"), i18n("List all links"), this); + a = new KAction(KIcon("kget"), i18n("List All Links"), this); connect(a, SIGNAL(triggered(bool)), page(), SLOT(downloadAllContentsWithKGet())); menu.addAction(a); } menu.addAction(mainwindow->actionByName("page_source")); - - a = new KAction( KIcon("layer-visible-on"), i18n("Inspect Element"), this); + + a = new KAction(KIcon("layer-visible-on"), i18n("Inspect Element"), this); connect(a, SIGNAL(triggered(bool)), this, SLOT(inspect())); menu.addAction(a); - + a = Application::bookmarkProvider()->actionByName("rekonq_add_bookmark"); menu.addAction(a); } - if(mainwindow->isFullScreen()) + if (mainwindow->isFullScreen()) { menu.addSeparator(); menu.addAction(mainwindow->actionByName("fullscreen")); @@ -306,33 +308,69 @@ void WebView::contextMenuEvent(QContextMenuEvent *event) void WebView::mousePressEvent(QMouseEvent *event) { - switch(event->button()) + if (_isAutoScrollEnabled) + { + setCursor(Qt::ArrowCursor); + _VScrollSpeed = 0; + _HScrollSpeed = 0; + _scrollTimer->stop(); + _isAutoScrollEnabled = false; + return; + } + + QWebHitTestResult result = page()->mainFrame()->hitTestContent(event->pos()); + _canEnableAutoScroll = !result.isContentEditable() && result.linkUrl().isEmpty(); + + switch (event->button()) { - case Qt::XButton1: + case Qt::XButton1: triggerPageAction(KWebPage::Back); break; - case Qt::XButton2: + + case Qt::XButton2: triggerPageAction(KWebPage::Forward); break; - default: - KWebView::mousePressEvent(event); + + case Qt::MidButton: + if (_canEnableAutoScroll && !_isAutoScrollEnabled) + { + setCursor(KIcon("transform-move").pixmap(32)); + _clickPos = event->pos(); + _isAutoScrollEnabled = true; + } + break; + + default: break; }; + KWebView::mousePressEvent(event); } void WebView::mouseMoveEvent(QMouseEvent *event) { - m_mousePos = event->pos(); + _mousePos = event->pos(); + + if (_isAutoScrollEnabled) + { + QPoint r = _mousePos - _clickPos; + _HScrollSpeed = r.x() / 2; // you are too fast.. + _VScrollSpeed = r.y() / 2; + if (!_scrollTimer->isActive()) + _scrollTimer->start(); + + return; + } + if (Application::instance()->mainWindow()->isFullScreen()) - { - if (event->pos().y()>=0 && event->pos().y()<=4) + { + if (event->pos().y() >= 0 && event->pos().y() <= 4) { - Application::instance()->mainWindow()->setWidgetsVisible(true); + Application::instance()->mainWindow()->setWidgetsVisible(true); } else { - Application::instance()->mainWindow()->setWidgetsVisible(false); + Application::instance()->mainWindow()->setWidgetsVisible(false); } } KWebView::mouseMoveEvent(event); @@ -341,16 +379,16 @@ void WebView::mouseMoveEvent(QMouseEvent *event) QPoint WebView::mousePos() { - return m_mousePos; + return _mousePos; } void WebView::search() { KAction *a = qobject_cast<KAction*>(sender()); - QString search = a->data().toString() + selectedText(); - KUrl urlSearch = KUrl::fromEncoded(search.toUtf8()); - + KService::Ptr engine = KService::serviceByDesktopPath(a->data().toString()); + KUrl urlSearch = KUrl(SearchEngine::buildQuery(engine, selectedText())); + emit loadUrl(urlSearch, Rekonq::NewCurrentTab); } @@ -381,7 +419,7 @@ void WebView::openLinkInNewWindow() { KAction *a = qobject_cast<KAction*>(sender()); KUrl url(a->data().toUrl()); - + emit loadUrl(url, Rekonq::NewWindow); } @@ -390,25 +428,80 @@ void WebView::openLinkInNewTab() { KAction *a = qobject_cast<KAction*>(sender()); KUrl url(a->data().toUrl()); - + emit loadUrl(url, Rekonq::SettingOpenTab); } void WebView::keyPressEvent(QKeyEvent *event) { - if ((event->modifiers() == Qt::ControlModifier) && (event->key() == Qt::Key_C)) + if (event->modifiers() == Qt::ControlModifier) { - triggerPageAction(KWebPage::Copy); - return; + if (event->key() == Qt::Key_C) + { + triggerPageAction(KWebPage::Copy); + return; + } + + if (event->key() == Qt::Key_A) + { + triggerPageAction(KWebPage::SelectAll); + return; + } } - if ((event->modifiers() == Qt::ControlModifier) && (event->key() == Qt::Key_A)) + if (!_canEnableAutoScroll) { - triggerPageAction(KWebPage::SelectAll); + KWebView::keyPressEvent(event); return; } - + + // Auto Scrolling + if (event->modifiers() == Qt::ShiftModifier) + { + if (event->key() == Qt::Key_Up) + { + _VScrollSpeed--; + if (!_scrollTimer->isActive()) + _scrollTimer->start(); + return; + } + + if (event->key() == Qt::Key_Down) + { + _VScrollSpeed++; + if (!_scrollTimer->isActive()) + _scrollTimer->start(); + return; + } + + if (event->key() == Qt::Key_Right) + { + _HScrollSpeed++; + if (!_scrollTimer->isActive()) + _scrollTimer->start(); + return; + } + + if (event->key() == Qt::Key_Left) + { + _HScrollSpeed--; + if (!_scrollTimer->isActive()) + _scrollTimer->start(); + return; + } + + if (_scrollTimer->isActive()) + { + _scrollTimer->stop(); + } + else + { + if (_VScrollSpeed || _HScrollSpeed) + _scrollTimer->start(); + } + } + KWebView::keyPressEvent(event); } @@ -416,8 +509,9 @@ void WebView::keyPressEvent(QKeyEvent *event) void WebView::inspect() { QAction *a = Application::instance()->mainWindow()->actionByName("web_inspector"); - if(a && !a->isChecked()) + if (a && !a->isChecked()) a->trigger(); + pageAction(QWebPage::InspectElement)->trigger(); } @@ -425,3 +519,19 @@ void WebView::loadUrlInNewTab(const KUrl &url) { emit loadUrl(url, Rekonq::SettingOpenTab); } + + +void WebView::scrollFrameChanged() +{ + // do the scrolling + page()->currentFrame()->scroll(_HScrollSpeed, _VScrollSpeed); + + // check if we reached the end + int y = page()->currentFrame()->scrollPosition().y(); + if (y == 0 || y == page()->currentFrame()->scrollBarMaximum(Qt::Vertical)) + _VScrollSpeed = 0; + + int x = page()->currentFrame()->scrollPosition().x(); + if (x == 0 || x == page()->currentFrame()->scrollBarMaximum(Qt::Horizontal)) + _HScrollSpeed = 0; +} |