diff options
Diffstat (limited to 'src/urlbar/urlbar.cpp')
-rw-r--r-- | src/urlbar/urlbar.cpp | 773 |
1 files changed, 0 insertions, 773 deletions
diff --git a/src/urlbar/urlbar.cpp b/src/urlbar/urlbar.cpp deleted file mode 100644 index 21debceb..00000000 --- a/src/urlbar/urlbar.cpp +++ /dev/null @@ -1,773 +0,0 @@ -/* ============================================================ -* -* This file is a part of the rekonq project -* -* Copyright (C) 2008-2012 by Andrea Diamantini <adjam7 at gmail dot com> -* Copyright (C) 2009 by Domrachev Alexandr <alexandr.domrachev@gmail.com> -* Copyright (C) 2009 by Paweł Prażak <pawelprazak at gmail dot com> -* Copyright (C) 2009-2011 by Lionel Chauvin <megabigbug@yahoo.fr> -* -* -* 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 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 -* 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 -* GNU General Public License for more details. -* -* You should have received a copy of the GNU General Public License -* along with this program. If not, see <http://www.gnu.org/licenses/>. -* -* ============================================================ */ - - -// Self Includes -#include "urlbar.h" -#include "urlbar.moc" - -// Auto Includes -#include "rekonq.h" - -// Local Includes -#include "application.h" -#include "mainwindow.h" -#include "webtab.h" -#include "webpage.h" -#include "webview.h" -#include "completionwidget.h" -#include "bookmarkmanager.h" -#include "bookmarkowner.h" -#include "bookmarkwidget.h" -#include "iconmanager.h" -#include "favoritewidget.h" -#include "searchengine.h" -#include "websnap.h" - -// KDE Includes -#include <KCompletionBox> -#include <KStandardDirs> -#include <KColorScheme> -#include <KMenu> -#include <KIconLoader> - -// Qt Includes -#include <QPainter> -#include <QPaintEvent> -#include <QPalette> -#include <QVBoxLayout> -#include <QClipboard> -#include <QTimer> - -// const values -const int c_iconMargin = 4; - - -IconButton::IconButton(QWidget *parent) - : QToolButton(parent) -{ - setToolButtonStyle(Qt::ToolButtonIconOnly); - setStyleSheet("IconButton { background-color:transparent; border: none; padding: 0px}"); - setCursor(Qt::ArrowCursor); - - setContextMenuPolicy(Qt::PreventContextMenu); -} - - -void IconButton::mouseReleaseEvent(QMouseEvent* event) -{ - emit clicked(event->globalPos()); -} - - -// ----------------------------------------------------------------------------------------------------------- - - -QString guessUrlWithCustomFirstLevel(const QString &str1, const QString &str2) -{ - QUrl url(QL1S("http://www.") + str1); - QString host = url.host().toLower(); - if (!host.endsWith(str2, Qt::CaseInsensitive)) - { - host += str2; - url.setHost(host); - } - return url.toString(); -} - -// ----------------------------------------------------------------------------------------------------------- - - -UrlBar::UrlBar(QWidget *parent) - : KLineEdit(parent) - , _tab(0) - , _icon(new IconButton(this)) - , _suggestionTimer(new QTimer(this)) -{ - setLayoutDirection(Qt::LeftToRight); - - // set initial icon - _icon->setIcon(KIcon("arrow-right")); - - // initial style - setStyleSheet(QString("UrlBar { padding: 2px 0 2px %1px; height: %1px } ").arg(_icon->sizeHint().width())); - - // doesn't show the clear button - setClearButtonShown(false); - - // enable dragging - setDragEnabled(true); - - // insert decoded URLs - setUrlDropsEnabled(true); - - // tooltip - setToolTip(i18n("Type here to search your bookmarks, history and the web...")); - - // accept focus, via tabbing, clicking & wheeling - setFocusPolicy(Qt::WheelFocus); - - // disable completion object (we have our own :) ) - setCompletionObject(0); - - _tab = qobject_cast<WebTab *>(parent); - - connect(_tab, SIGNAL(loadProgressing()), this, SLOT(update())); - - connect(_tab->view(), SIGNAL(urlChanged(QUrl)), this, SLOT(setQUrl(QUrl))); - connect(_tab->view(), SIGNAL(loadFinished(bool)), this, SLOT(loadFinished())); - connect(_tab->view(), SIGNAL(loadStarted()), this, SLOT(clearRightIcons())); - connect(_tab->view(), SIGNAL(iconChanged()), this, SLOT(refreshFavicon())); - - // search icon - connect(rApp->opensearchManager(), SIGNAL(openSearchEngineAdded(QString)), this, SLOT(updateRightIcons())); - - // bookmark icon - connect(rApp->bookmarkManager(), SIGNAL(bookmarksUpdated()), this, SLOT(updateRightIcons())); - - _suggestionTimer->setSingleShot(true); - connect(_suggestionTimer, SIGNAL(timeout()), this, SLOT(suggest())); - - activateSuggestions(true); -} - - -UrlBar::~UrlBar() -{ - _suggestionTimer->stop(); - activateSuggestions(false); - _box.clear(); - - disconnect(); -} - - -void UrlBar::setQUrl(const QUrl& url) -{ - if (url.scheme() == QL1S("about")) - { - clear(); - setFocus(); - } - else - { - clearFocus(); - KLineEdit::setUrl(url); - setCursorPosition(0); - refreshFavicon(); - } -} - - -void UrlBar::loadRequestedUrl(const KUrl& url, Rekonq::OpenType type) -{ - activateSuggestions(false); - clearFocus(); - setUrl(url); - rApp->loadUrl(url, type); -} - - -void UrlBar::loadDigitedUrl() -{ - UrlResolver res(text()); - UrlSearchList list = res.orderedSearchItems(); - if (list.isEmpty()) - { - loadRequestedUrl(KUrl(text())); - } - else - { - loadRequestedUrl(list.first().url); - } -} - - -void UrlBar::paintEvent(QPaintEvent *event) -{ - KColorScheme colorScheme(palette().currentColorGroup()); - QColor backgroundColor; - QColor foregroundColor; - - if (QWebSettings::globalSettings()->testAttribute(QWebSettings::PrivateBrowsingEnabled)) - { - backgroundColor = QColor(220, 220, 220); // light gray - foregroundColor = Qt::black; - } - else - { - backgroundColor = rApp->palette().color(QPalette::Base); - foregroundColor = rApp->palette().color(QPalette::Text); - } - - // set background color of UrlBar - QPalette p = palette(); - - int progr = _tab->progress(); - if (progr == 0 || progr == 100) - { - if (_tab->url().scheme() == QL1S("https")) - { - backgroundColor = _tab->page()->hasSslValid() - ? colorScheme.background(KColorScheme::PositiveBackground).color() - : colorScheme.background(KColorScheme::NegativeBackground).color(); - - foregroundColor = colorScheme.foreground(KColorScheme::NormalText).color(); - } - p.setBrush(QPalette::Base, backgroundColor); - p.setBrush(QPalette::Text, foregroundColor); - } - else - { - QColor highlight = rApp->palette().color(QPalette::Highlight); - - int r = (highlight.red() + 2 * backgroundColor.red()) / 3; - int g = (highlight.green() + 2 * backgroundColor.green()) / 3; - int b = (highlight.blue() + 2 * backgroundColor.blue()) / 3; - - QColor loadingColor(r, g, b); - - if (abs(loadingColor.lightness() - backgroundColor.lightness()) < 20) //eg. Gaia color scheme - { - r = (2 * highlight.red() + backgroundColor.red()) / 3; - g = (2 * highlight.green() + backgroundColor.green()) / 3; - b = (2 * highlight.blue() + backgroundColor.blue()) / 3; - loadingColor = QColor(r, g, b); - } - - QLinearGradient gradient(QPoint(0, 0), QPoint(width(), 0)); - gradient.setColorAt(0, loadingColor); - gradient.setColorAt(((double)progr) / 100 - .000001, loadingColor); - gradient.setColorAt(((double)progr) / 100, backgroundColor); - p.setBrush(QPalette::Base, gradient); - } - setPalette(p); - - // you need this before our code to draw inside the line edit.. - KLineEdit::paintEvent(event); - - if (text().isEmpty() && (progr == 0 || progr == 100)) - { - QStyleOptionFrame option; - initStyleOption(&option); - QRect textRect = style()->subElementRect(QStyle::SE_LineEditContents, &option, this); - QPainter painter(this); - painter.setPen(Qt::gray); - painter.drawText(textRect, - Qt::AlignVCenter | Qt::AlignCenter, - i18n("Type here to search your bookmarks, history and the web...") - ); - } -} - - -void UrlBar::keyPressEvent(QKeyEvent *event) -{ - QString currentText = text().trimmed(); - - if (currentText.isEmpty()) - return KLineEdit::keyPressEvent(event); - - // this handles the Modifiers + Return key combinations - if (event->key() == Qt::Key_Return || event->key() == Qt::Key_Enter) - { - switch (event->modifiers()) - { - case Qt::AltModifier: - loadRequestedUrl(currentText, Rekonq::NewFocusedTab); - break; - - case Qt::ControlModifier: - loadRequestedUrl(guessUrlWithCustomFirstLevel(currentText, QL1S(".com"))); - break; - - case 0x06000000: // Qt::ControlModifier | Qt::ShiftModifier: - loadRequestedUrl(guessUrlWithCustomFirstLevel(currentText, QL1S(".org"))); - break; - - case Qt::ShiftModifier: - loadRequestedUrl(guessUrlWithCustomFirstLevel(currentText, QL1S(".net"))); - break; - - default: - loadRequestedUrl(currentText); - break; - } - } - - if (event->key() == Qt::Key_Escape) - { - clearFocus(); - if (!(_tab->url().protocol() == QL1S("about"))) - setText(_tab->url().url()); - event->accept(); - } - - KLineEdit::keyPressEvent(event); -} - - -void UrlBar::focusInEvent(QFocusEvent *event) -{ - activateSuggestions(true); - rApp->mainWindow()->updateTabActions(); - - KLineEdit::focusInEvent(event); -} - - -void UrlBar::dropEvent(QDropEvent *event) -{ - // handles only plain-text with url format - if (event->mimeData()->hasFormat("text/plain") && event->source() != this) - { - QUrl url = QUrl::fromUserInput(event->mimeData()->data("text/plain")); - - if (url.isValid()) - { - setQUrl(url); - loadRequestedUrl(text()); - return; - } - } - - // handles everything else - KLineEdit::dropEvent(event); - loadRequestedUrl(text()); -} - - -void UrlBar::loadFinished() -{ - if (_tab->url().scheme() == QL1S("about")) - { - update(); - return; - } - - // show bookmark info - IconButton *bt = addRightIcon(UrlBar::BK); - connect(bt, SIGNAL(clicked(QPoint)), this, SLOT(manageBookmarks())); - - // show favorite icon - IconButton *fbt = addRightIcon(UrlBar::Favorite); - connect(fbt, SIGNAL(clicked(QPoint)), this, SLOT(manageFavorites(QPoint))); - - // show KGet downloads?? - if (!KStandardDirs::findExe("kget").isNull() && ReKonfig::kgetList()) - { - IconButton *bt = addRightIcon(UrlBar::KGet); - connect(bt, SIGNAL(clicked(QPoint)), _tab->page(), SLOT(downloadAllContentsWithKGet())); - } - - // show RSS - if (_tab->hasRSSInfo()) - { - IconButton *bt = addRightIcon(UrlBar::RSS); - connect(bt, SIGNAL(clicked(QPoint)), _tab, SLOT(showRSSInfo(QPoint))); - } - - // show SSL - if (_tab->url().scheme() == QL1S("https")) - { - // NOTE: the choice for the right SSL icon is done in the addRightIcon method - IconButton *bt = addRightIcon(UrlBar::SSL); - connect(bt, SIGNAL(clicked(QPoint)), _tab->page(), SLOT(showSSLInfo(QPoint))); - } - - // show add search engine - if (_tab->hasNewSearchEngine()) - { - IconButton *bt = addRightIcon(UrlBar::SearchEngine); - connect(bt, SIGNAL(clicked(QPoint)), _tab, SLOT(showSearchEngine(QPoint))); - } - - if (_tab->hasAdBlockedElements()) - { - IconButton *bt = addRightIcon(UrlBar::AdBlock); - - connect(bt, SIGNAL(clicked(QPoint)), (QObject *) rApp->adblockManager(), SLOT(showBlockedItemDialog())); - } - - // we need to update urlbar after the right icon settings - // removing this code (where setStyleSheet automatically calls update) needs adding again - // an update call - int oneIconWidth = _icon->sizeHint().width(); - int rightIconWidth = (oneIconWidth + c_iconMargin) * (_rightIconsList.count()); - setStyleSheet(QString("UrlBar { padding: 2px %2px 2px %1px; height: %1px } ").arg(oneIconWidth).arg(rightIconWidth)); -} - - -void UrlBar::updateRightIcons() -{ - if (!_tab->isPageLoading()) - { - clearRightIcons(); - loadFinished(); - } -} - - -void UrlBar::activateSuggestions(bool b) -{ - if (b) - { - if (_box.isNull()) - { - _box = new CompletionWidget(this); - installEventFilter(_box.data()); - connect(_box.data(), SIGNAL(chosenUrl(KUrl, Rekonq::OpenType)), this, SLOT(loadRequestedUrl(KUrl, Rekonq::OpenType))); - - // activate suggestions on edit text - connect(this, SIGNAL(textChanged(QString)), this, SLOT(detectTypedString(QString))); - } - } - else - { - disconnect(this, SIGNAL(textChanged(QString)), this, SLOT(detectTypedString(QString))); - removeEventFilter(_box.data()); - if (!_box.isNull()) - _box.data()->deleteLater(); - } -} - - -void UrlBar::mouseDoubleClickEvent(QMouseEvent *event) -{ - Q_UNUSED(event); - - selectAll(); -} - - -void UrlBar::contextMenuEvent(QContextMenuEvent* event) -{ - KMenu menu; - const bool clipboardFilled = !rApp->clipboard()->text().isEmpty(); - - // Cut - KAction *a = KStandardAction::cut(this, SLOT(cut()), this); - a->setEnabled(hasSelectedText()); - menu.addAction(a); - - // Copy - a = KStandardAction::copy(this, SLOT(copy()), this); - a->setEnabled(hasSelectedText()); - menu.addAction(a); - - // Paste - a = KStandardAction::paste(this, SLOT(paste()), this); - a->setEnabled(clipboardFilled); - menu.addAction(a); - - // Paste & Go - const QString clipboardText = rApp->clipboard()->text(); - if (isValidURL(clipboardText) || clipboardText.isEmpty()) - { - a = new KAction(i18n("Paste && Go"), this); - connect(a, SIGNAL(triggered(bool)), this, SLOT(pasteAndGo())); - } - else - { - a = new KAction(i18n("Paste && Search"), this); - connect(a, SIGNAL(triggered(bool)), this, SLOT(pasteAndSearch())); - } - a->setEnabled(clipboardFilled); - menu.addAction(a); - - // Delete - a = new KAction(KIcon("edit-delete"), i18n("Delete"), this); - connect(a, SIGNAL(triggered(bool)), this, SLOT(delSlot())); - a->setEnabled(hasSelectedText()); - menu.addAction(a); - - menu.addSeparator(); - - // Select All - a = KStandardAction::selectAll(this, SLOT(selectAll()), this); - a->setEnabled(!text().isEmpty()); - menu.addAction(a); - - menu.exec(event->globalPos()); -} - - -bool UrlBar::isValidURL(QString url) -{ - bool isValid = false; - if (url.startsWith(QL1S("http://")) - || url.startsWith(QL1S("https://")) - || url.startsWith(QL1S("ftp://")) - ) - url = url.remove(QRegExp("(http|https|ftp)://")); - - if (url.contains(QL1C('.')) - && url.indexOf(QL1C('.')) > 0 - && url.indexOf(QL1C('.')) < url.length() - && !url.trimmed().contains(QL1C(' ')) - && QUrl::fromUserInput(url).isValid() - ) - isValid = true; - - return isValid; -} - - -IconButton *UrlBar::addRightIcon(UrlBar::icon ic) -{ - IconButton *rightIcon = new IconButton(this); - - switch (ic) - { - case UrlBar::KGet: - rightIcon->setIcon(KIcon("download")); - rightIcon->setToolTip(i18n("List all links with KGet")); - break; - case UrlBar::RSS: - rightIcon->setIcon(KIcon("application-rss+xml")); - rightIcon->setToolTip(i18n("List all available RSS feeds")); - break; - case UrlBar::SSL: - _tab->page()->hasSslValid() - ? rightIcon->setIcon(KIcon("object-locked")) - : rightIcon->setIcon(KIcon("object-unlocked")); - rightIcon->setToolTip(i18n("Show SSL Info")); - break; - case UrlBar::BK: - if (rApp->bookmarkManager()->bookmarkForUrl(_tab->url()).isNull()) - { - rightIcon->setIcon(KIcon("bookmarks").pixmap(32, 32, QIcon::Disabled)); - rightIcon->setToolTip(i18n("Bookmark this page")); - } - else - { - rightIcon->setIcon(KIcon("bookmarks")); - rightIcon->setToolTip(i18n("Edit this bookmark")); - } - break; - case UrlBar::SearchEngine: - { - KIcon wsIcon("edit-web-search"); - if (wsIcon.isNull()) - { - wsIcon = KIcon("preferences-web-browser-shortcuts"); - } - rightIcon->setIcon(wsIcon); - rightIcon->setToolTip(i18n("Add search engine")); - break; - } - case UrlBar::Favorite: - if (ReKonfig::previewUrls().contains(_tab->url().url())) - { - rightIcon->setIcon(KIcon("emblem-favorite")); - rightIcon->setToolTip(i18n("Remove from favorite")); - } - else - { - rightIcon->setIcon(KIcon("emblem-favorite").pixmap(32, 32, QIcon::Disabled)); - rightIcon->setToolTip(i18n("Add to favorites")); - } - break; - case UrlBar::AdBlock: - rightIcon->setIcon(KIcon("preferences-web-browser-adblock")); - rightIcon->setToolTip(i18n("There are elements blocked by AdBlock")); - break; - default: - ASSERT_NOT_REACHED("ERROR.. default non extant case!!"); - break; - } - - _rightIconsList << rightIcon; - - int iconsCount = _rightIconsList.count(); - updateRightIconPosition(rightIcon, iconsCount); - - rightIcon->show(); - - return rightIcon; -} - - -void UrlBar::clearRightIcons() -{ - qDeleteAll(_rightIconsList); - _rightIconsList.clear(); -} - - -void UrlBar::resizeEvent(QResizeEvent *event) -{ - int ih = _icon->sizeHint().height(); - int iconsCount = _rightIconsList.count(); - int iconHeight = (height() - ih) / 2; - - _icon->move(c_iconMargin, iconHeight); - - for (int i = 0; i < iconsCount; ++i) - { - IconButton *bt = _rightIconsList.at(i); - updateRightIconPosition(bt, i + 1); - } - - KLineEdit::resizeEvent(event); -} - - -void UrlBar::detectTypedString(const QString &typed) -{ - if (typed.count() == 1) - { - QTimer::singleShot(0, this, SLOT(suggest())); - return; - } - - if (_suggestionTimer->isActive()) - _suggestionTimer->stop(); - _suggestionTimer->start(50); -} - - -void UrlBar::suggest() -{ - if (!_box.isNull()) - _box.data()->suggestUrls(text()); -} - - -void UrlBar::refreshFavicon() -{ - if (QWebSettings::globalSettings()->testAttribute(QWebSettings::PrivateBrowsingEnabled)) - { - _icon->setIcon(KIcon("view-media-artist")); - return; - } - - KUrl u = _tab->url(); - if (u.scheme() == QL1S("about")) - { - _icon->setIcon(KIcon("arrow-right")); - return; - } - _icon->setIcon(rApp->iconManager()->iconForUrl(u)); -} - - -void UrlBar::pasteAndGo() -{ - loadRequestedUrl(rApp->clipboard()->text()); -} - - -void UrlBar::pasteAndSearch() -{ - KService::Ptr defaultEngine = SearchEngine::defaultEngine(); - if (defaultEngine) - loadRequestedUrl(KUrl(SearchEngine::buildQuery(defaultEngine, rApp->clipboard()->text()))); -} - - -void UrlBar::delSlot() -{ - del(); -} - - -void UrlBar::manageBookmarks() -{ - if (_tab->url().scheme() == QL1S("about")) - return; - - KBookmark bookmark = rApp->bookmarkManager()->bookmarkForUrl(_tab->url()); - - if (bookmark.isNull()) - { - bookmark = rApp->bookmarkManager()->owner()->bookmarkCurrentPage(); - } - - // calculate position - int iconSize = IconSize(KIconLoader::Small) + c_iconMargin; - - // Add a generic 10 to move it a bit below and right. - // No need to be precise... - int iconWidth = 10 + width() - ((iconSize + c_iconMargin)); - int iconHeight = 10 + (height() - iconSize) / 2; - - QPoint p = mapToGlobal(QPoint(iconWidth, iconHeight)); - - // show bookmark widget - BookmarkWidget *widget = new BookmarkWidget(bookmark, window()); - widget->showAt(p); -} - - -void UrlBar::manageFavorites(QPoint pos) -{ - IconButton *bt = qobject_cast<IconButton *>(this->sender()); - if (!bt) - return; - - if (_tab->url().scheme() == QL1S("about")) - return; - - if (ReKonfig::previewUrls().contains(_tab->url().url())) - { - // remove site from favorites - FavoriteWidget *widget = new FavoriteWidget(_tab, window()); - connect(widget, SIGNAL(updateIcon()), this, SLOT(updateRightIcons())); - widget->showAt(pos); - return; - } - - // else, add as favorite - QStringList urls = ReKonfig::previewUrls(); - urls << _tab->url().url(); - ReKonfig::setPreviewUrls(urls); - - QStringList titles = ReKonfig::previewNames(); - titles << _tab->view()->title(); - ReKonfig::setPreviewNames(titles); - - // also, save a site snapshot - WebSnap *snap = new WebSnap(_tab->url(), this); - - updateRightIcons(); -} - - -void UrlBar::updateRightIconPosition(IconButton *icon, int iconsCount) -{ - // NOTE: cannot show a (let's say) 16x16 icon in a 16x16 square. - // It needs some margin. It usually is 3, but using 4 (default rekonq icon margin) - // seems NOT a big problem and let's us using just one const ;) - int iconSize = IconSize(KIconLoader::Small) + c_iconMargin; - - int iconWidth = width() - ((iconSize + c_iconMargin) * iconsCount); - int iconHeight = (height() - iconSize) / 2; - - icon->move(iconWidth, iconHeight); -} |