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

0001 /*
0002    SPDX-FileCopyrightText: 2013-2024 Laurent Montel <montel@kde.org>
0003 
0004    SPDX-License-Identifier: LGPL-2.0-or-later
0005 */
0006 
0007 #pragma once
0008 
0009 #include "textcustomeditor_export.h"
0010 
0011 #include <QPlainTextEdit>
0012 
0013 namespace Sonnet
0014 {
0015 class Highlighter;
0016 class SpellCheckDecorator;
0017 }
0018 namespace TextCustomEditor
0019 {
0020 /**
0021  * @brief The PlainTextEditor class
0022  * @author Laurent Montel <montel@kde.org>
0023  */
0024 class TEXTCUSTOMEDITOR_EXPORT PlainTextEditor : public QPlainTextEdit
0025 {
0026     Q_OBJECT
0027     Q_PROPERTY(bool searchSupport READ searchSupport WRITE setSearchSupport)
0028     Q_PROPERTY(bool spellCheckingSupport READ spellCheckingSupport WRITE setSpellCheckingSupport)
0029     Q_PROPERTY(bool textToSpeechSupport READ textToSpeechSupport WRITE setTextToSpeechSupport)
0030     Q_PROPERTY(bool webShortcutSupport READ webShortcutSupport WRITE setWebShortcutSupport)
0031     Q_PROPERTY(bool emojiSupport READ emojiSupport WRITE setEmojiSupport)
0032 public:
0033     explicit PlainTextEditor(QWidget *parent = nullptr);
0034     ~PlainTextEditor() override;
0035 
0036     enum SupportFeature {
0037         None = 0,
0038         Search = 1,
0039         SpellChecking = 2,
0040         TextToSpeech = 4,
0041         AllowWebShortcut = 8,
0042         Emoji = 16,
0043     };
0044     Q_DECLARE_FLAGS(SupportFeatures, SupportFeature)
0045 
0046     void setSearchSupport(bool b);
0047     [[nodiscard]] bool searchSupport() const;
0048 
0049     [[nodiscard]] bool spellCheckingSupport() const;
0050     void setSpellCheckingSupport(bool check);
0051 
0052     virtual void setReadOnly(bool readOnly);
0053 
0054     void setTextToSpeechSupport(bool b);
0055     [[nodiscard]] bool textToSpeechSupport() const;
0056 
0057     void setWebShortcutSupport(bool b);
0058     [[nodiscard]] bool webShortcutSupport() const;
0059 
0060     virtual void createHighlighter();
0061 
0062     void addIgnoreWords(const QStringList &lst);
0063     [[nodiscard]] bool activateLanguageMenu() const;
0064     void setActivateLanguageMenu(bool activate);
0065     [[nodiscard]] Sonnet::Highlighter *highlighter() const;
0066     [[nodiscard]] bool checkSpellingEnabled() const;
0067     void setCheckSpellingEnabled(bool check);
0068     void setSpellCheckingConfigFileName(const QString &_fileName);
0069     [[nodiscard]] QString spellCheckingConfigFileName() const;
0070     [[nodiscard]] const QString &spellCheckingLanguage() const;
0071     void setSpellCheckingLanguage(const QString &_language);
0072 
0073     void setEmojiSupport(bool b);
0074     [[nodiscard]] bool emojiSupport() const;
0075 
0076 public Q_SLOTS:
0077     void slotDisplayMessageIndicator(const QString &message);
0078     void slotCheckSpelling();
0079     void slotSpeakText();
0080     void slotZoomReset();
0081 
0082 protected:
0083     virtual void addExtraMenuEntry(QMenu *menu, QPoint pos);
0084     void contextMenuEvent(QContextMenuEvent *event) override;
0085     [[nodiscard]] bool event(QEvent *ev) override;
0086     void keyPressEvent(QKeyEvent *event) override;
0087     [[nodiscard]] bool overrideShortcut(QKeyEvent *event);
0088     [[nodiscard]] bool handleShortcut(QKeyEvent *event);
0089     void wheelEvent(QWheelEvent *event) override;
0090 
0091     virtual Sonnet::SpellCheckDecorator *createSpellCheckDecorator();
0092     void setHighlighter(Sonnet::Highlighter *_highLighter);
0093     void focusInEvent(QFocusEvent *event) override;
0094     virtual void updateHighLighter();
0095     virtual void clearDecorator();
0096 
0097 Q_SIGNALS:
0098     void findText();
0099     void replaceText();
0100     void spellCheckerAutoCorrect(const QString &currentWord, const QString &autoCorrectWord);
0101     void checkSpellingChanged(bool);
0102     void languageChanged(const QString &);
0103     void spellCheckStatus(const QString &);
0104     void say(const QString &text);
0105 
0106 private:
0107     TEXTCUSTOMEDITOR_NO_EXPORT void slotUndoableClear();
0108     TEXTCUSTOMEDITOR_NO_EXPORT void slotSpellCheckerMisspelling(const QString &text, int pos);
0109     TEXTCUSTOMEDITOR_NO_EXPORT void slotSpellCheckerCorrected(const QString &, int, const QString &);
0110     TEXTCUSTOMEDITOR_NO_EXPORT void slotSpellCheckerAutoCorrect(const QString &, const QString &);
0111     TEXTCUSTOMEDITOR_NO_EXPORT void slotSpellCheckerCanceled();
0112     TEXTCUSTOMEDITOR_NO_EXPORT void slotSpellCheckerFinished();
0113 
0114     TEXTCUSTOMEDITOR_NO_EXPORT void slotLanguageSelected();
0115     TEXTCUSTOMEDITOR_NO_EXPORT void slotToggleAutoSpellCheck();
0116     TEXTCUSTOMEDITOR_NO_EXPORT void addIgnoreWordsToHighLighter();
0117     TEXTCUSTOMEDITOR_NO_EXPORT void deleteWordBack();
0118     TEXTCUSTOMEDITOR_NO_EXPORT void deleteWordForward();
0119     TEXTCUSTOMEDITOR_NO_EXPORT void highlightWord(int length, int pos);
0120     TEXTCUSTOMEDITOR_NO_EXPORT void deleteEndOfLine();
0121     TEXTCUSTOMEDITOR_NO_EXPORT void moveLineUpDown(bool moveUp);
0122     TEXTCUSTOMEDITOR_NO_EXPORT void moveCursorBeginUpDown(bool moveUp);
0123     TEXTCUSTOMEDITOR_NO_EXPORT void regenerateColorScheme();
0124     TEXTCUSTOMEDITOR_NO_EXPORT void updateReadOnlyColor();
0125     TEXTCUSTOMEDITOR_NO_EXPORT void slotInsertEmoticon(const QString &str);
0126     class PlainTextEditorPrivate;
0127     std::unique_ptr<PlainTextEditorPrivate> const d;
0128 };
0129 }