File indexing completed on 2026-02-08 14:58:06

0001 /*
0002    SPDX-FileCopyrightText: 2013-2023 Laurent Montel <montel@kde.org>
0003 
0004    SPDX-License-Identifier: LGPL-2.0-or-later
0005 */
0006 
0007 #include "plaintexteditorwidget.h"
0008 #include "config-textcustomeditor.h"
0009 #include "plaintexteditfindbar.h"
0010 #include "plaintexteditor.h"
0011 #include <TextAddonsWidgets/SlideContainer>
0012 #if HAVE_KTEXTADDONS_TEXT_TO_SPEECH_SUPPORT
0013 #include <TextEditTextToSpeech/TextToSpeechContainerWidget>
0014 #endif
0015 #include <QTextCursor>
0016 #include <QVBoxLayout>
0017 
0018 using namespace TextCustomEditor;
0019 class Q_DECL_HIDDEN TextCustomEditor::PlainTextEditorWidgetPrivate
0020 {
0021 public:
0022     PlainTextEditorWidgetPrivate() = default;
0023 
0024     TextCustomEditor::PlainTextEditFindBar *mFindBar = nullptr;
0025     PlainTextEditor *mEditor = nullptr;
0026 #if HAVE_KTEXTADDONS_TEXT_TO_SPEECH_SUPPORT
0027     TextEditTextToSpeech::TextToSpeechContainerWidget *mTextToSpeechWidget = nullptr;
0028 #endif
0029     TextAddonsWidgets::SlideContainer *mSliderContainer = nullptr;
0030 };
0031 
0032 PlainTextEditorWidget::PlainTextEditorWidget(PlainTextEditor *customEditor, QWidget *parent)
0033     : QWidget(parent)
0034     , d(new TextCustomEditor::PlainTextEditorWidgetPrivate)
0035 {
0036     init(customEditor);
0037 }
0038 
0039 PlainTextEditorWidget::PlainTextEditorWidget(QWidget *parent)
0040     : QWidget(parent)
0041     , d(new TextCustomEditor::PlainTextEditorWidgetPrivate)
0042 {
0043     init();
0044 }
0045 
0046 PlainTextEditorWidget::~PlainTextEditorWidget() = default;
0047 
0048 PlainTextEditor *PlainTextEditorWidget::editor() const
0049 {
0050     return d->mEditor;
0051 }
0052 
0053 void PlainTextEditorWidget::clear()
0054 {
0055     d->mEditor->clear();
0056 }
0057 
0058 void PlainTextEditorWidget::setSpellCheckingConfigFileName(const QString &_fileName)
0059 {
0060     d->mEditor->setSpellCheckingConfigFileName(_fileName);
0061 }
0062 
0063 void PlainTextEditorWidget::setPlainText(const QString &text)
0064 {
0065     d->mEditor->setPlainText(text);
0066 }
0067 
0068 bool PlainTextEditorWidget::isEmpty() const
0069 {
0070     return d->mEditor->document()->isEmpty();
0071 }
0072 
0073 QString PlainTextEditorWidget::toPlainText() const
0074 {
0075     return d->mEditor->toPlainText();
0076 }
0077 
0078 void PlainTextEditorWidget::init(PlainTextEditor *customEditor)
0079 {
0080     auto lay = new QVBoxLayout(this);
0081     lay->setContentsMargins({});
0082 #if HAVE_KTEXTADDONS_TEXT_TO_SPEECH_SUPPORT
0083     d->mTextToSpeechWidget = new TextEditTextToSpeech::TextToSpeechContainerWidget(this);
0084     lay->addWidget(d->mTextToSpeechWidget);
0085 #endif
0086     if (customEditor) {
0087         d->mEditor = customEditor;
0088     } else {
0089         d->mEditor = new PlainTextEditor;
0090     }
0091     lay->addWidget(d->mEditor);
0092 #if HAVE_KTEXTADDONS_TEXT_TO_SPEECH_SUPPORT
0093     connect(d->mEditor, &PlainTextEditor::say, d->mTextToSpeechWidget, &TextEditTextToSpeech::TextToSpeechContainerWidget::say);
0094 #endif
0095     d->mSliderContainer = new TextAddonsWidgets::SlideContainer(this);
0096 
0097     d->mFindBar = new TextCustomEditor::PlainTextEditFindBar(d->mEditor, this);
0098     d->mFindBar->setHideWhenClose(false);
0099     connect(d->mFindBar, &TextCustomEditor::PlainTextEditFindBar::displayMessageIndicator, d->mEditor, &PlainTextEditor::slotDisplayMessageIndicator);
0100     connect(d->mFindBar, &TextCustomEditor::PlainTextEditFindBar::hideFindBar, this, &PlainTextEditorWidget::slotHideFindBar);
0101     d->mSliderContainer->setContent(d->mFindBar);
0102 
0103     lay->addWidget(d->mSliderContainer);
0104 
0105     connect(d->mEditor, &PlainTextEditor::findText, this, &PlainTextEditorWidget::slotFind);
0106 
0107     connect(d->mEditor, &PlainTextEditor::replaceText, this, &PlainTextEditorWidget::slotReplace);
0108 }
0109 
0110 void PlainTextEditorWidget::slotHideFindBar()
0111 {
0112     d->mSliderContainer->slideOut();
0113     d->mEditor->setFocus();
0114 }
0115 
0116 bool PlainTextEditorWidget::isReadOnly() const
0117 {
0118     return d->mEditor->isReadOnly();
0119 }
0120 
0121 void PlainTextEditorWidget::setReadOnly(bool readOnly)
0122 {
0123     d->mEditor->setReadOnly(readOnly);
0124 }
0125 
0126 void PlainTextEditorWidget::slotReplace()
0127 {
0128     if (d->mEditor->searchSupport()) {
0129         if (d->mEditor->textCursor().hasSelection()) {
0130             d->mFindBar->setText(d->mEditor->textCursor().selectedText());
0131         }
0132         d->mFindBar->showReplace();
0133         d->mSliderContainer->slideIn();
0134         d->mFindBar->focusAndSetCursor();
0135     }
0136 }
0137 
0138 void PlainTextEditorWidget::slotFind()
0139 {
0140     if (d->mEditor->searchSupport()) {
0141         if (d->mEditor->textCursor().hasSelection()) {
0142             d->mFindBar->setText(d->mEditor->textCursor().selectedText());
0143         }
0144         d->mEditor->moveCursor(QTextCursor::Start);
0145         d->mFindBar->showFind();
0146         d->mSliderContainer->slideIn();
0147         d->mFindBar->focusAndSetCursor();
0148     }
0149 }
0150 
0151 #include "moc_plaintexteditorwidget.cpp"