File indexing completed on 2024-06-02 04:47:07

0001 /*
0002    SPDX-FileCopyrightText: 2012-2024 Laurent Montel <montel@kde.org>
0003 
0004    SPDX-License-Identifier: LGPL-2.0-or-later
0005 */
0006 
0007 #include "plaintexteditfindbar.h"
0008 #include "widgets/findutils.h"
0009 #include "widgets/textfindreplacewidget.h"
0010 
0011 #include <KLocalizedString>
0012 #include <TextUtils/ConvertText>
0013 
0014 #include <QLineEdit>
0015 #include <QPlainTextEdit>
0016 #include <QRegularExpression>
0017 
0018 using namespace TextCustomEditor;
0019 class TextCustomEditor::PlainTextEditFindBarPrivate
0020 {
0021 public:
0022     explicit PlainTextEditFindBarPrivate(QPlainTextEdit *view)
0023         : mView(view)
0024     {
0025     }
0026 
0027     QPlainTextEdit *const mView;
0028 };
0029 
0030 PlainTextEditFindBar::PlainTextEditFindBar(QPlainTextEdit *view, QWidget *parent)
0031     : TextEditFindBarBase(parent)
0032     , d(new TextCustomEditor::PlainTextEditFindBarPrivate(view))
0033 {
0034 }
0035 
0036 PlainTextEditFindBar::~PlainTextEditFindBar() = default;
0037 
0038 void PlainTextEditFindBar::slotSearchText(bool backward, bool isAutoSearch)
0039 {
0040     d->mView->moveCursor(QTextCursor::Start);
0041     searchText(backward, isAutoSearch);
0042 }
0043 
0044 bool PlainTextEditFindBar::viewIsReadOnly() const
0045 {
0046     return d->mView->isReadOnly();
0047 }
0048 
0049 bool PlainTextEditFindBar::documentIsEmpty() const
0050 {
0051     return d->mView->document()->isEmpty();
0052 }
0053 
0054 bool PlainTextEditFindBar::searchInDocument(const QString &text, TextEditFindBarBase::FindFlags searchOptions)
0055 {
0056     bool found = false;
0057     if (searchOptions & TextEditFindBarBase::FindRespectDiacritics) {
0058         found = d->mView->find(text, FindUtils::convertTextEditFindFlags(searchOptions));
0059     } else {
0060         found = FindUtils::find(d->mView, text, FindUtils::convertTextEditFindFlags(searchOptions));
0061     }
0062     mFindWidget->setFoundMatch(found);
0063     return found;
0064 }
0065 
0066 bool PlainTextEditFindBar::searchInDocument(const QRegularExpression &regExp, TextEditFindBarBase::FindFlags searchOptions)
0067 {
0068     const bool found = d->mView->find(regExp, FindUtils::convertTextEditFindFlags(searchOptions));
0069     mFindWidget->setFoundMatch(found);
0070     return found;
0071 }
0072 
0073 void PlainTextEditFindBar::autoSearchMoveCursor()
0074 {
0075     QTextCursor cursor = d->mView->textCursor();
0076     cursor.setPosition(cursor.selectionStart());
0077     d->mView->setTextCursor(cursor);
0078 }
0079 
0080 void PlainTextEditFindBar::slotReplaceText()
0081 {
0082     const TextEditFindBarBase::FindFlags searchOptions = mFindWidget->searchOptions();
0083     if (d->mView->textCursor().hasSelection()) {
0084         if (mFindWidget->isRegularExpression()) {
0085             if (d->mView->textCursor().selectedText().contains(mFindWidget->searchRegularExpression())) {
0086                 d->mView->textCursor().insertText(mReplaceWidget->replaceLineEdit()->text());
0087                 // search next after replace text.
0088                 searchText(false, false);
0089             }
0090         } else {
0091             if (searchOptions & TextEditFindBarBase::FindRespectDiacritics) {
0092                 if (TextUtils::ConvertText::normalize(d->mView->textCursor().selectedText()) == TextUtils::ConvertText::normalize(mFindWidget->searchText())) {
0093                     d->mView->textCursor().insertText(mReplaceWidget->replaceLineEdit()->text());
0094                     // search next after replace text.
0095                     searchText(false, false);
0096                 } else {
0097                     if (d->mView->textCursor().selectedText() == mFindWidget->searchText()) {
0098                         d->mView->textCursor().insertText(mReplaceWidget->replaceLineEdit()->text());
0099                         // search next after replace text.
0100                         searchText(false, false);
0101                     }
0102                 }
0103             }
0104         }
0105     } else {
0106         searchText(false, false);
0107     }
0108 }
0109 
0110 void PlainTextEditFindBar::slotReplaceAllText()
0111 {
0112     int count = 0;
0113     const QString replaceStr{mReplaceWidget->replaceLineEdit()->text()};
0114     const TextEditFindBarBase::FindFlags searchOptions{mFindWidget->searchOptions()};
0115     if (mFindWidget->isRegularExpression()) {
0116         count = FindUtils::replaceAll(d->mView->document(), mFindWidget->searchRegularExpression(), replaceStr, searchOptions);
0117     } else {
0118         count = FindUtils::replaceAll(d->mView, mFindWidget->searchText(), replaceStr, searchOptions);
0119     }
0120     Q_EMIT displayMessageIndicator(i18np("%1 replacement made", "%1 replacements made", count));
0121 }
0122 
0123 #include "moc_plaintexteditfindbar.cpp"