File indexing completed on 2024-05-12 16:44:04

0001 /*
0002     SPDX-FileCopyrightText: 2013-2015 Christian Dávid <christian-david@web.de>
0003     SPDX-FileCopyrightText: 2017-2018 Łukasz Wojniłowicz <lukasz.wojnilowicz@gmail.com>
0004     SPDX-License-Identifier: GPL-2.0-or-later
0005 */
0006 
0007 #include "kmymoneytextedithighlighter.h"
0008 
0009 /* The Higligther */
0010 
0011 class KMyMoneyTextEditHighlighterPrivate
0012 {
0013     Q_DISABLE_COPY(KMyMoneyTextEditHighlighterPrivate)
0014 
0015 public:
0016     KMyMoneyTextEditHighlighterPrivate() :
0017         m_allowedChars(QString(QString())),
0018         m_maxLines(-1),
0019         m_maxLineLength(-1),
0020         m_maxLength(-1)
0021     {
0022     }
0023 
0024     QString m_allowedChars;
0025     int m_maxLines;
0026     int m_maxLineLength;
0027     int m_maxLength;
0028 };
0029 
0030 
0031 KMyMoneyTextEditHighlighter::KMyMoneyTextEditHighlighter(QTextEdit *parent) : // krazy:exclude=qclasses
0032     Highlighter(parent),
0033     d_ptr(new KMyMoneyTextEditHighlighterPrivate)
0034 {
0035 }
0036 
0037 KMyMoneyTextEditHighlighter::~KMyMoneyTextEditHighlighter()
0038 {
0039     Q_D(KMyMoneyTextEditHighlighter);
0040     delete d;
0041 }
0042 
0043 void KMyMoneyTextEditHighlighter::setAllowedChars(const QString& chars)
0044 {
0045     Q_D(KMyMoneyTextEditHighlighter);
0046     d->m_allowedChars = chars;
0047     rehighlight();
0048 }
0049 
0050 void KMyMoneyTextEditHighlighter::setMaxLength(const int& length)
0051 {
0052     Q_D(KMyMoneyTextEditHighlighter);
0053     d->m_maxLength = length;
0054     rehighlight();
0055 }
0056 
0057 void KMyMoneyTextEditHighlighter::setMaxLines(const int& lines)
0058 {
0059     Q_D(KMyMoneyTextEditHighlighter);
0060     d->m_maxLines = lines;
0061     rehighlight();
0062 }
0063 
0064 void KMyMoneyTextEditHighlighter::setMaxLineLength(const int& length)
0065 {
0066     Q_D(KMyMoneyTextEditHighlighter);
0067     d->m_maxLineLength = length;
0068     rehighlight();
0069 }
0070 
0071 void KMyMoneyTextEditHighlighter::highlightBlock(const QString& text)
0072 {
0073     Q_D(KMyMoneyTextEditHighlighter);
0074     // Spell checker first
0075     Highlighter::highlightBlock(text);
0076 
0077     QTextCharFormat invalidFormat;
0078     invalidFormat.setFontItalic(true);
0079     invalidFormat.setForeground(Qt::red);
0080     invalidFormat.setUnderlineStyle(QTextCharFormat::SingleUnderline);
0081 
0082     // Check used characters
0083     const int length = text.length();
0084     for (auto i = 0; i < length; ++i) {
0085         if (!d->m_allowedChars.contains(text.at(i))) {
0086             setFormat(i, 1, invalidFormat);
0087         }
0088     }
0089 
0090     if (d->m_maxLines != -1) {
0091         //! @todo Is using QTextBlock::blockNumber() as line number dangerous?
0092         if (currentBlock().blockNumber() >= d->m_maxLines) {
0093             setFormat(0, length, invalidFormat);
0094             return;
0095         }
0096     }
0097 
0098     if (d->m_maxLength != -1) {
0099         const int blockPosition = currentBlock().position();
0100         if (d->m_maxLength < (length + blockPosition)) {
0101             setFormat(d->m_maxLength, length - d->m_maxLength - blockPosition, invalidFormat);
0102             return;
0103         }
0104     }
0105 
0106     if (d->m_maxLineLength != -1 && length >= d->m_maxLineLength) {
0107         setFormat(d->m_maxLineLength, length - d->m_maxLineLength, invalidFormat);
0108         return;
0109     }
0110 }