File indexing completed on 2024-05-26 04:46:49

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