File indexing completed on 2024-04-28 15:51:44

0001 /*
0002     SPDX-FileCopyrightText: 2007 Pino Toscano <pino@kde.org>
0003 
0004     SPDX-License-Identifier: GPL-2.0-or-later
0005 */
0006 
0007 #include "findbar.h"
0008 
0009 // qt/kde includes
0010 #include <KLocalizedString>
0011 #include <QEvent>
0012 #include <QIcon>
0013 #include <QKeyEvent>
0014 #include <QLabel>
0015 #include <QLayout>
0016 #include <QMenu>
0017 #include <QPushButton>
0018 #include <QToolButton>
0019 
0020 // local includes
0021 #include "core/document.h"
0022 #include "searchlineedit.h"
0023 #include "settings.h"
0024 
0025 FindBar::FindBar(Okular::Document *document, QWidget *parent)
0026     : QWidget(parent)
0027     , m_active(false)
0028 {
0029     QHBoxLayout *lay = new QHBoxLayout(this);
0030     lay->setContentsMargins(2, 2, 2, 2);
0031 
0032     QToolButton *closeBtn = new QToolButton(this);
0033     closeBtn->setIcon(QIcon::fromTheme(QStringLiteral("dialog-close")));
0034     closeBtn->setToolTip(i18n("Close"));
0035     closeBtn->setAutoRaise(true);
0036     lay->addWidget(closeBtn);
0037 
0038     QLabel *label = new QLabel(i18nc("Find text", "F&ind:"), this);
0039     lay->addWidget(label);
0040 
0041     m_search = new SearchLineWidget(this, document);
0042     m_search->lineEdit()->setSearchCaseSensitivity(Qt::CaseInsensitive);
0043     m_search->lineEdit()->setSearchMinimumLength(0);
0044     m_search->lineEdit()->setSearchType(Okular::Document::NextMatch);
0045     m_search->lineEdit()->setSearchId(PART_SEARCH_ID);
0046     m_search->lineEdit()->setSearchColor(qRgb(255, 255, 64));
0047     m_search->lineEdit()->setSearchMoveViewport(true);
0048     m_search->lineEdit()->setFindAsYouType(false);
0049     m_search->lineEdit()->setToolTip(i18n("Text to search for"));
0050     m_search->installEventFilter(this);
0051     label->setBuddy(m_search->lineEdit());
0052     lay->addWidget(m_search);
0053 
0054     QPushButton *findNextBtn = new QPushButton(QIcon::fromTheme(QStringLiteral("go-down-search")), i18nc("Find and go to the next search match", "Next"), this);
0055     findNextBtn->setToolTip(i18n("Jump to next match"));
0056     lay->addWidget(findNextBtn);
0057 
0058     QPushButton *findPrevBtn = new QPushButton(QIcon::fromTheme(QStringLiteral("go-up-search")), i18nc("Find and go to the previous search match", "Previous"), this);
0059     findPrevBtn->setToolTip(i18n("Jump to previous match"));
0060     lay->addWidget(findPrevBtn);
0061 
0062     QPushButton *optionsBtn = new QPushButton(this);
0063     optionsBtn->setText(i18n("Options"));
0064     optionsBtn->setToolTip(i18n("Modify search behavior"));
0065     QMenu *optionsMenu = new QMenu(optionsBtn);
0066     m_caseSensitiveAct = optionsMenu->addAction(i18n("Case sensitive"));
0067     m_caseSensitiveAct->setCheckable(true);
0068     m_fromCurrentPageAct = optionsMenu->addAction(i18n("From current page"));
0069     m_fromCurrentPageAct->setCheckable(true);
0070     m_findAsYouTypeAct = optionsMenu->addAction(i18n("Find as you type"));
0071     m_findAsYouTypeAct->setCheckable(true);
0072     optionsBtn->setMenu(optionsMenu);
0073     lay->addWidget(optionsBtn);
0074 
0075     connect(closeBtn, &QAbstractButton::clicked, this, &FindBar::closeAndStopSearch);
0076     connect(findNextBtn, &QAbstractButton::clicked, this, &FindBar::findNext);
0077     connect(findPrevBtn, &QAbstractButton::clicked, this, &FindBar::findPrev);
0078     connect(m_caseSensitiveAct, &QAction::toggled, this, &FindBar::caseSensitivityChanged);
0079     connect(m_fromCurrentPageAct, &QAction::toggled, this, &FindBar::fromCurrentPageChanged);
0080     connect(m_findAsYouTypeAct, &QAction::toggled, this, &FindBar::findAsYouTypeChanged);
0081 
0082     m_caseSensitiveAct->setChecked(Okular::Settings::searchCaseSensitive());
0083     m_fromCurrentPageAct->setChecked(Okular::Settings::searchFromCurrentPage());
0084     m_findAsYouTypeAct->setChecked(Okular::Settings::findAsYouType());
0085 
0086     hide();
0087 
0088     // "activate" it only at th very end
0089     m_active = true;
0090 }
0091 
0092 FindBar::~FindBar()
0093 {
0094 }
0095 
0096 bool FindBar::eventFilter(QObject *target, QEvent *event)
0097 {
0098     if (target == m_search) {
0099         if (event->type() == QEvent::KeyPress) {
0100             QKeyEvent *keyEvent = static_cast<QKeyEvent *>(event);
0101             if (keyEvent->key() == Qt::Key_PageUp || keyEvent->key() == Qt::Key_PageDown) {
0102                 Q_EMIT forwardKeyPressEvent(keyEvent);
0103                 return true;
0104             }
0105         }
0106     }
0107     return false;
0108 }
0109 
0110 QString FindBar::text() const
0111 {
0112     return m_search->lineEdit()->text();
0113 }
0114 
0115 Qt::CaseSensitivity FindBar::caseSensitivity() const
0116 {
0117     return m_caseSensitiveAct->isChecked() ? Qt::CaseSensitive : Qt::CaseInsensitive;
0118 }
0119 
0120 void FindBar::focusAndSetCursor()
0121 {
0122     setFocus();
0123     m_search->lineEdit()->selectAll();
0124     m_search->lineEdit()->setFocus();
0125 }
0126 
0127 bool FindBar::maybeHide()
0128 {
0129     if (m_search->lineEdit()->isSearchRunning()) {
0130         m_search->lineEdit()->stopSearch();
0131         return false;
0132     } else {
0133         hide();
0134         return true;
0135     }
0136 }
0137 
0138 void FindBar::findNext()
0139 {
0140     m_search->lineEdit()->setSearchType(Okular::Document::NextMatch);
0141     m_search->lineEdit()->findNext();
0142 }
0143 
0144 void FindBar::findPrev()
0145 {
0146     m_search->lineEdit()->setSearchType(Okular::Document::PreviousMatch);
0147     m_search->lineEdit()->findPrev();
0148 }
0149 
0150 void FindBar::resetSearch()
0151 {
0152     m_search->lineEdit()->resetSearch();
0153 }
0154 
0155 void FindBar::caseSensitivityChanged()
0156 {
0157     m_search->lineEdit()->setSearchCaseSensitivity(m_caseSensitiveAct->isChecked() ? Qt::CaseSensitive : Qt::CaseInsensitive);
0158     if (!m_active) {
0159         return;
0160     }
0161     Okular::Settings::setSearchCaseSensitive(m_caseSensitiveAct->isChecked());
0162     Okular::Settings::self()->save();
0163     m_search->lineEdit()->restartSearch();
0164 }
0165 
0166 void FindBar::fromCurrentPageChanged()
0167 {
0168     m_search->lineEdit()->setSearchFromStart(!m_fromCurrentPageAct->isChecked());
0169     if (!m_active) {
0170         return;
0171     }
0172     Okular::Settings::setSearchFromCurrentPage(m_fromCurrentPageAct->isChecked());
0173     Okular::Settings::self()->save();
0174 }
0175 
0176 void FindBar::findAsYouTypeChanged()
0177 {
0178     m_search->lineEdit()->setFindAsYouType(m_findAsYouTypeAct->isChecked());
0179     if (!m_active) {
0180         return;
0181     }
0182     Okular::Settings::setFindAsYouType(m_findAsYouTypeAct->isChecked());
0183     Okular::Settings::self()->save();
0184 }
0185 
0186 void FindBar::closeAndStopSearch()
0187 {
0188     if (m_search->lineEdit()->isSearchRunning()) {
0189         m_search->lineEdit()->stopSearch();
0190     }
0191     Q_EMIT onCloseButtonPressed();
0192     close();
0193 }
0194 
0195 void FindBar::startSearch(const QString &findText)
0196 {
0197     m_search->lineEdit()->setText(findText);
0198     show();
0199 }
0200 
0201 #include "moc_findbar.cpp"