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 ®Exp, 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"