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"