summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/CMakeLists.txt1
-rw-r--r--src/webwindow/findbar.cpp318
-rw-r--r--src/webwindow/findbar.h80
-rw-r--r--src/webwindow/webwindow.cpp16
-rw-r--r--src/webwindow/webwindow.h8
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;