File indexing completed on 2024-06-09 04:40:25

0001 /*
0002   SPDX-FileCopyrightText: 2022-2024 Laurent Montel <montel@kde.org>
0003 
0004   SPDX-License-Identifier: GPL-2.0-or-later
0005 */
0006 
0007 #include "autocorrectionlineedit.h"
0008 #include <QKeyEvent>
0009 #include <QTextCursor>
0010 #include <TextAutoCorrectionCore/AutoCorrection>
0011 
0012 using namespace TextAutoCorrectionWidgets;
0013 using namespace TextAutoCorrectionCore;
0014 class TextAutoCorrectionWidgets::AutoCorrectionLineEditPrivate
0015 {
0016 public:
0017     AutoCorrectionLineEditPrivate()
0018         : mAutoCorrection(new TextAutoCorrectionCore::AutoCorrection())
0019     {
0020     }
0021 
0022     ~AutoCorrectionLineEditPrivate()
0023     {
0024         if (mNeedToDeleteAutoCorrection) {
0025             delete mAutoCorrection;
0026         }
0027     }
0028 
0029     TextAutoCorrectionCore::AutoCorrection *mAutoCorrection = nullptr;
0030     bool mNeedToDeleteAutoCorrection = true;
0031 };
0032 
0033 AutoCorrectionLineEdit::AutoCorrectionLineEdit(QWidget *parent)
0034     : QPlainTextEdit(parent)
0035     , d(new TextAutoCorrectionWidgets::AutoCorrectionLineEditPrivate)
0036 {
0037     setTabChangesFocus(true);
0038     // widget may not be resized vertically
0039     setSizePolicy(QSizePolicy(QSizePolicy::MinimumExpanding, QSizePolicy::Fixed));
0040     setLineWrapMode(NoWrap);
0041     setHorizontalScrollBarPolicy(Qt::ScrollBarAlwaysOff);
0042     setVerticalScrollBarPolicy(Qt::ScrollBarAlwaysOff);
0043     document()->adjustSize();
0044     document()->setDocumentMargin(2);
0045 }
0046 
0047 AutoCorrectionLineEdit::~AutoCorrectionLineEdit() = default;
0048 
0049 TextAutoCorrectionCore::AutoCorrection *AutoCorrectionLineEdit::autocorrection() const
0050 {
0051     return d->mAutoCorrection;
0052 }
0053 
0054 void AutoCorrectionLineEdit::setAutocorrection(AutoCorrection *autocorrect)
0055 {
0056     d->mNeedToDeleteAutoCorrection = false;
0057     delete d->mAutoCorrection;
0058     d->mAutoCorrection = autocorrect;
0059 }
0060 
0061 void AutoCorrectionLineEdit::setAutocorrectionLanguage(const QString &language)
0062 {
0063     TextAutoCorrectionCore::AutoCorrectionSettings *settings = d->mAutoCorrection->autoCorrectionSettings();
0064     settings->setLanguage(language);
0065     d->mAutoCorrection->setAutoCorrectionSettings(settings);
0066 }
0067 
0068 void AutoCorrectionLineEdit::keyPressEvent(QKeyEvent *e)
0069 {
0070     if (d->mAutoCorrection && d->mAutoCorrection->autoCorrectionSettings()->isEnabledAutoCorrection()) {
0071         if ((e->key() == Qt::Key_Space) || (e->key() == Qt::Key_Enter) || (e->key() == Qt::Key_Return)) {
0072             if (!textCursor().hasSelection()) {
0073                 int position = textCursor().position();
0074                 // no Html format in subject. => false
0075                 const bool addSpace = d->mAutoCorrection->autocorrect(false, *document(), position);
0076                 QTextCursor cur = textCursor();
0077                 cur.setPosition(position);
0078                 if (e->key() == Qt::Key_Space) {
0079                     if (addSpace) {
0080                         cur.insertText(QStringLiteral(" "));
0081                         setTextCursor(cur);
0082                     }
0083                     return;
0084                 }
0085             }
0086         }
0087     }
0088     QPlainTextEdit::keyPressEvent(e);
0089 }
0090 
0091 #include "moc_autocorrectionlineedit.cpp"