]> git.lyx.org Git - lyx.git/blobdiff - src/frontends/qt4/LaTeXHighlighter.cpp
Skip paint event when in the middle of a buffer operation
[lyx.git] / src / frontends / qt4 / LaTeXHighlighter.cpp
index 00f8064af9e081573b634513401140bd2a6cddd7..5ab349e485ca7b541855e62c18597e07d6a0e84e 100644 (file)
 namespace lyx {
 namespace frontend {
 
-LaTeXHighlighter::LaTeXHighlighter(QTextDocument * parent)
-       : QSyntaxHighlighter(parent)
+
+LaTeXHighlighter::LaTeXHighlighter(QTextDocument * parent, bool at_letter)
+       : QSyntaxHighlighter(parent), at_letter_(at_letter)
 {
-       keywordFormat.setForeground(Qt::darkBlue);
+       auto blend = [](QColor color1, QColor color2) {
+               int r = 0.5 * (color1.red() + color2.red());
+               int g = 0.5 * (color1.green() + color2.green());
+               int b = 0.5 * (color1.blue() + color2.blue());
+               return QColor(r, g, b);
+       };
+       QPalette palette = QPalette();
+       QColor text_color = palette.color(QPalette::Active, QPalette::Text);
+       keywordFormat.setForeground(blend(Qt::blue, text_color));
        keywordFormat.setFontWeight(QFont::Bold);
-       commentFormat.setForeground(Qt::darkGray);
-       mathFormat.setForeground(Qt::red);
+       commentFormat.setForeground(palette.color(QPalette::Disabled,
+                                                 QPalette::Text));
+       mathFormat.setForeground(blend(Qt::red, text_color));
        warningFormat.setForeground(Qt::red);
        warningFormat.setFontWeight(QFont::Bold);
 }
@@ -35,11 +45,11 @@ void LaTeXHighlighter::highlightBlock(QString const & text)
 {
        // $ $
        static const QRegExp exprMath("\\$[^\\$]*\\$");
-       int index = text.indexOf(exprMath);
+       int index = exprMath.indexIn(text);
        while (index >= 0) {
                int length = exprMath.matchedLength();
                setFormat(index, length, mathFormat);
-               index = text.indexOf(exprMath, index + length);
+               index = exprMath.indexIn(text, index + length);
        }
        // [ ]
        static const QRegExp exprStartDispMath("(\\\\\\[|"
@@ -67,9 +77,9 @@ void LaTeXHighlighter::highlightBlock(QString const & text)
        // start search from 0 (for end disp math)
        // otherwise, start search from 'begin disp math'
        if (previousBlockState() != 1)
-               startIndex = text.indexOf(exprStartDispMath);
+               startIndex = exprStartDispMath.indexIn(text);
        while (startIndex >= 0) {
-               int endIndex = text.indexOf(exprEndDispMath, startIndex);
+               int endIndex = exprEndDispMath.indexIn(text, startIndex);
                int length;
                if (endIndex == -1) {
                        setCurrentBlockState(1);
@@ -78,40 +88,44 @@ void LaTeXHighlighter::highlightBlock(QString const & text)
                        length = endIndex - startIndex + exprEndDispMath.matchedLength();
                }
                setFormat(startIndex, length, mathFormat);
-               startIndex = text.indexOf(exprStartDispMath, startIndex + length);
+               startIndex = exprStartDispMath.indexIn(text, startIndex + length);
        }
        // \whatever
-       static const QRegExp exprKeyword("\\\\[A-Za-z]+");
-       index = text.indexOf(exprKeyword);
+       static const QRegExp exprKeywordAtOther("\\\\[A-Za-z]+");
+       // \wh@tever
+       static const QRegExp exprKeywordAtLetter("\\\\[A-Za-z@]+");
+       QRegExp const & exprKeyword = at_letter_ ? exprKeywordAtLetter
+                                                : exprKeywordAtOther;
+       index = exprKeyword.indexIn(text);
        while (index >= 0) {
                int length = exprKeyword.matchedLength();
                setFormat(index, length, keywordFormat);
-               index = text.indexOf(exprKeyword, index + length);
+               index = exprKeyword.indexIn(text, index + length);
        }
        // %comment
        // Treat a line as a comment starting at a percent sign
        // * that is the first character in a line
-       // * that is preceded by 
+       // * that is preceded by
        // ** an even number of backslashes
        // ** any character other than a backslash
-       QRegExp exprComment("(?:^|[^\\\\])(?:\\\\\\\\)*(%).*$"); 
-       text.indexOf(exprComment);
+       QRegExp exprComment("(?:^|[^\\\\])(?:\\\\\\\\)*(%).*$");
+       exprComment.indexIn(text);
        index = exprComment.pos(1);
        while (index >= 0) {
-               int const length = exprComment.matchedLength() 
+               int const length = exprComment.matchedLength()
                                 - (index - exprComment.pos(0));
                setFormat(index, length, commentFormat);
-               text.indexOf(exprComment, index + length);
+               exprComment.indexIn(text, index + length);
                index = exprComment.pos(1);
        }
        // <LyX Warning: ...>
        QString lyxwarn = qt_("LyX Warning: ");
        QRegExp exprWarning("<" + lyxwarn + "[^<]*>");
-       index = text.indexOf(exprWarning);
+       index = exprWarning.indexIn(text);
        while (index >= 0) {
                int length = exprWarning.matchedLength();
                setFormat(index, length, warningFormat);
-               index = text.indexOf(exprWarning, index + length);
+               index = exprWarning.indexIn(text, index + length);
        }
 }