diff options
-rw-r--r-- | src/CMakeLists.txt | 1 | ||||
-rw-r--r-- | src/webwindow/findbar.cpp | 318 | ||||
-rw-r--r-- | src/webwindow/findbar.h | 80 | ||||
-rw-r--r-- | src/webwindow/webwindow.cpp | 16 | ||||
-rw-r--r-- | src/webwindow/webwindow.h | 8 |
5 files changed, 421 insertions, 2 deletions
diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt index 6c41fef6..682953f8 100644 --- a/src/CMakeLists.txt +++ b/src/CMakeLists.txt @@ -94,6 +94,7 @@ set(rekonq_KDEINIT_SRCS webtab/webview.cpp webtab/webtab.cpp #---------------------------------------- + webwindow/findbar.cpp webwindow/rekonqfactory.cpp webwindow/rekonqmenu.cpp webwindow/webwindow.cpp diff --git a/src/webwindow/findbar.cpp b/src/webwindow/findbar.cpp new file mode 100644 index 00000000..8e6a98a6 --- /dev/null +++ b/src/webwindow/findbar.cpp @@ -0,0 +1,318 @@ +/* ============================================================ +* +* This file is a part of the rekonq project +* +* Copyright (C) 2008-2012 by Andrea Diamantini <adjam7 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 "findbar.h" +#include "findbar.moc" + +// Local Includes +#include "webtab.h" +#include "webpage.h" +#include "webwindow.h" + +// KDE Includes +#include <KApplication> +#include <KIcon> +#include <KLineEdit> +#include <KLocalizedString> +#include <KPushButton> +#include <KColorScheme> + +// Qt Includes +#include <QTimer> + +#include <QCheckBox> +#include <QHBoxLayout> +#include <QKeyEvent> +#include <QLabel> +#include <QToolButton> +#include <QWebFrame> + + +FindBar::FindBar(QWidget *parent) + : QWidget(parent) + , m_lineEdit(new KLineEdit(this)) + , m_hideTimer(new QTimer(this)) + , m_matchCase(new QCheckBox(i18n("&Match case"), this)) + , m_highlightAll(new QCheckBox(i18n("&Highlight all"), this)) +{ + QHBoxLayout *layout = new QHBoxLayout; + + // cosmetic + layout->setContentsMargins(2, 0, 2, 0); + + // hide button + QToolButton *hideButton = new QToolButton(this); + hideButton->setAutoRaise(true); + hideButton->setIcon(KIcon("dialog-close")); + connect(hideButton, SIGNAL(clicked()), this, SLOT(hide())); + layout->addWidget(hideButton); + layout->setAlignment(hideButton, Qt::AlignLeft | Qt::AlignTop); + + // hide timer + connect(m_hideTimer, SIGNAL(timeout()), this, SLOT(hide())); + m_hideTimer->setSingleShot(true); + + // label + QLabel *label = new QLabel(i18n("Find:")); + layout->addWidget(label); + + // Find Bar signal + connect(this, SIGNAL(searchString(QString)), this, SLOT(find(QString))); + + // lineEdit, focusProxy + setFocusProxy(m_lineEdit); + m_lineEdit->setMaximumWidth(250); + connect(m_lineEdit, SIGNAL(textChanged(QString)), this, SLOT(find(QString))); + layout->addWidget(m_lineEdit); + + // buttons + KPushButton *findNext = new KPushButton(KIcon("go-down"), i18n("&Next"), this); + KPushButton *findPrev = new KPushButton(KIcon("go-up"), i18n("&Previous"), this); + connect(findNext, SIGNAL(clicked()), this, SLOT(findNext())); + connect(findPrev, SIGNAL(clicked()), this, SLOT(findPrevious())); + layout->addWidget(findNext); + layout->addWidget(findPrev); + + // Case sensitivity. Deliberately set so this is off by default. + m_matchCase->setCheckState(Qt::Unchecked); + m_matchCase->setTristate(false); + connect(m_matchCase, SIGNAL(toggled(bool)), this, SLOT(matchCaseUpdate())); + layout->addWidget(m_matchCase); + + // Hightlight All. On by default + m_highlightAll->setCheckState(Qt::Checked); + m_highlightAll->setTristate(false); + connect(m_highlightAll, SIGNAL(toggled(bool)), this, SLOT(updateHighlight())); + layout->addWidget(m_highlightAll); + + // stretching widget on the left + layout->addStretch(); + + setLayout(layout); + + // we start off hidden + hide(); +} + + +void FindBar::keyPressEvent(QKeyEvent *event) +{ + if (event->key() == Qt::Key_Return) + { + if (event->modifiers() == Qt::ShiftModifier) + { + findPrevious(); + } + else + { + findNext(); + } + } + + QWidget::keyPressEvent(event); +} + + +bool FindBar::matchCase() const +{ + return m_matchCase->isChecked(); +} + + +bool FindBar::highlightAllState() const +{ + return m_highlightAll->isChecked(); +} + + +void FindBar::setVisible(bool visible) +{ + // parent webwindow + WebWindow *w = qobject_cast<WebWindow *>(parent()); + + if (visible + && w->page()->isOnRekonqPage() + && w->view()->part() != 0) + { + // findNext is the slot containing part integration code + findNext(); + return; + } + + QWidget::setVisible(visible); + + if (visible) + { + const QString selectedText = w->page()->selectedText(); + if (!hasFocus() && !selectedText.isEmpty()) + { + const QString previousText = m_lineEdit->text(); + m_lineEdit->setText(selectedText); + + if (m_lineEdit->text() != previousText) + findPrevious(); + else + updateHighlight(); + } + else if (selectedText.isEmpty()) + { + emit searchString(m_lineEdit->text()); + } + + m_hideTimer->start(60000); + + m_lineEdit->setFocus(); + m_lineEdit->selectAll(); + } + else + { + updateHighlight(); + m_hideTimer->stop(); + } +} + + +void FindBar::notifyMatch(bool match) +{ + QPalette p = m_lineEdit->palette(); + KColorScheme colorScheme(p.currentColorGroup()); + + if (m_lineEdit->text().isEmpty()) + { + p.setColor(QPalette::Base, colorScheme.background(KColorScheme::NormalBackground).color()); + } + else + { + if (match) + { + p.setColor(QPalette::Base, colorScheme.background(KColorScheme::PositiveBackground).color()); + } + else + { + p.setColor(QPalette::Base, colorScheme.background(KColorScheme::NegativeBackground).color()); // previous were 247, 230, 230 + } + } + m_lineEdit->setPalette(p); + m_hideTimer->start(60000); +} + + + +// FIND RELATED ------------------------------------------------------------------------------------- +void FindBar::find(const QString & search) +{ + _lastStringSearched = search; + + updateHighlight(); + findNext(); +} + + +void FindBar::findNext() +{ + // parent webwindow + WebWindow *w = qobject_cast<WebWindow *>(parent()); + + if (w->page()->isOnRekonqPage()) + { + // trigger part find action + KParts::ReadOnlyPart *p = w->view()->part(); + if (p) + { +// connect(this, SIGNAL(triggerPartFind()), p, SLOT(slotFind())); +// emit triggerPartFind(); + return; + } + } + + if (isHidden()) + { + QPoint previous_position = w->page()->currentFrame()->scrollPosition(); + w->page()->focusNextPrevChild(true); + w->page()->currentFrame()->setScrollPosition(previous_position); + return; + } + + QWebPage::FindFlags options = QWebPage::FindWrapsAroundDocument; + if (matchCase()) + options |= QWebPage::FindCaseSensitively; + + bool found = w->page()->findText(_lastStringSearched, options); + notifyMatch(found); + + if (!found) + { + QPoint previous_position = w->page()->currentFrame()->scrollPosition(); + w->page()->focusNextPrevChild(true); + w->page()->currentFrame()->setScrollPosition(previous_position); + } +} + + +void FindBar::findPrevious() +{ + // parent webwindow + WebWindow *w = qobject_cast<WebWindow *>(parent()); + + QWebPage::FindFlags options = QWebPage::FindBackward | QWebPage::FindWrapsAroundDocument; + if (matchCase()) + options |= QWebPage::FindCaseSensitively; + + bool found = w->page()->findText(_lastStringSearched, options); + notifyMatch(found); +} + + +void FindBar::matchCaseUpdate() +{ + // parent webwindow + WebWindow *w = qobject_cast<WebWindow *>(parent()); + + w->page()->findText(_lastStringSearched, QWebPage::FindBackward); + findNext(); + updateHighlight(); +} + + +void FindBar::updateHighlight() +{ + // parent webwindow + WebWindow *w = qobject_cast<WebWindow *>(parent()); + + QWebPage::FindFlags options = QWebPage::HighlightAllOccurrences; + + w->page()->findText(QL1S(""), options); //Clear an existing highlight + + if (!isHidden() && highlightAllState()) + { + if (matchCase()) + options |= QWebPage::FindCaseSensitively; + + w->page()->findText(_lastStringSearched, options); + } +} diff --git a/src/webwindow/findbar.h b/src/webwindow/findbar.h new file mode 100644 index 00000000..2371490d --- /dev/null +++ b/src/webwindow/findbar.h @@ -0,0 +1,80 @@ +/* ============================================================ +* +* This file is a part of the rekonq project +* +* Copyright (C) 2008-2012 by Andrea Diamantini <adjam7 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/>. +* +* ============================================================ */ + + +#ifndef FINDBAR_H +#define FINDBAR_H + + +// Rekonq Includes +#include "rekonq_defines.h" + +// Qt Includes +#include <QWidget> + +// Forward Declarations +class KLineEdit; + +class QString; +class QCheckBox; + + +class REKONQ_TESTS_EXPORT FindBar : public QWidget +{ + Q_OBJECT + +public: + FindBar(QWidget *parent); + + bool matchCase() const; + void notifyMatch(bool match); + bool highlightAllState() const; + + void setVisible(bool visible); + +protected: + void keyPressEvent(QKeyEvent *event); + +private Q_SLOTS: + void find(const QString &); + void matchCaseUpdate(); + void findNext(); + void findPrevious(); + void updateHighlight(); + +Q_SIGNALS: + void searchString(const QString &); + +private: + KLineEdit *m_lineEdit; + QTimer *m_hideTimer; + QCheckBox *m_matchCase; + QCheckBox *m_highlightAll; + + QString _lastStringSearched; +}; + +#endif diff --git a/src/webwindow/webwindow.cpp b/src/webwindow/webwindow.cpp index 87006bf8..0af79cb6 100644 --- a/src/webwindow/webwindow.cpp +++ b/src/webwindow/webwindow.cpp @@ -39,6 +39,7 @@ #include "webtab.h" #include "bookmarkstoolbar.h" +#include "findbar.h" #include "rekonqfactory.h" #include "rekonqmenu.h" #include "settingsdialog.h" @@ -72,6 +73,7 @@ WebWindow::WebWindow(QWidget *parent, WebPage *pg) , _bar(new UrlBar(_tab)) , _mainToolBar(0) , _bookmarksBar(0) + , m_findBar(new FindBar(this)) , m_loadStopReloadAction(0) , m_rekonqMenu(0) , m_popup(new QLabel(this)) @@ -101,6 +103,7 @@ WebWindow::WebWindow(QWidget *parent, WebPage *pg) l->addWidget(_mainToolBar); l->addWidget(_bookmarksBar); l->addWidget(_tab); + l->addWidget(m_findBar); l->setContentsMargins(0, 0, 0, 0); setContentsMargins(0, 0, 0, 0); @@ -128,6 +131,14 @@ WebWindow::WebWindow(QWidget *parent, WebPage *pg) } +WebWindow::~WebWindow() +{ + m_hidePopupTimer->stop(); + + BookmarkManager::self()->removeBookmarkBar(_bookmarksBar); +} + + void WebWindow::setupActions() { KAction *a; @@ -178,6 +189,11 @@ void WebWindow::setupActions() KStandardAction::preferences(this, SLOT(preferences()), actionCollection()); KStandardAction::quit(rApp, SLOT(queryQuit()), actionCollection()); + // find action + a = KStandardAction::find(m_findBar, SLOT(show()), actionCollection()); + KShortcut findShortcut = KStandardShortcut::find(); + a->setShortcut(findShortcut); + a = KStandardAction::fullScreen(this, SLOT(viewFullScreen(bool)), this, actionCollection()); KShortcut fullScreenShortcut = KStandardShortcut::fullScreen(); fullScreenShortcut.setAlternate(Qt::Key_F11); diff --git a/src/webwindow/webwindow.h b/src/webwindow/webwindow.h index 8d9afefc..697d74e3 100644 --- a/src/webwindow/webwindow.h +++ b/src/webwindow/webwindow.h @@ -44,6 +44,7 @@ class WebTab; class WebView; class BookmarkToolBar; +class FindBar; class UrlBar; class RekonqMenu; @@ -62,7 +63,8 @@ class WebWindow : public QWidget public: WebWindow(QWidget *parent = 0, WebPage *pg = 0); - + ~WebWindow(); + void load(const QUrl &); WebPage *page(); @@ -80,7 +82,7 @@ public: virtual KActionCollection *actionCollection () const; QAction *actionByName(const QString &name); - + private: void setupActions(); void setupTools(); @@ -136,6 +138,8 @@ private: KToolBar *_mainToolBar; BookmarkToolBar *_bookmarksBar; + FindBar *m_findBar; + KAction *m_loadStopReloadAction; KMenu *m_historyBackMenu; |