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 }