Go to the documentation of this file.00001 #include <QtGui>
00002
00003 #include "highlighter.h"
00004 Highlighter::Highlighter(QTextDocument *parent)
00005 : QSyntaxHighlighter(parent)
00006 {
00007 HighlightingRule rule;
00008 keywordFormat.setForeground(Qt::blue);
00009 keywordFormat.setFontWeight(QFont::Bold);
00010 QStringList keywordPatterns;
00011 keywordPatterns << "\\bbigint\\b" << "\\bbinary\\b" << "\\bbit\\b"
00012 << "\\bblob\\b" << "\\bbool\\b" << "\\bboolean\\b" << "\\bchar\\b"
00013 << "\\bdate\\b" << "\\bdatetime\\b" << "\\bdecimal\\b" << "\\bdouble\\b"
00014 << "\\benum\\b" << "\\bfloat\\b" << "\\bint\\b" << "\\blongblob\\b"
00015 << "\\bfloat\\b" << "\\bint\\b" << "\\blongblob\\b" << "\\blongtext\\b"
00016 << "\\bmediumblob\\b" << "\\bmediumint\\b" << "\\bmediumtext\\b"
00017 << "\\bnumeric\\b" << "\\breal\\b" << "\\bset\\b" << "\\bsmallint\\b"
00018 << "\\btext\\b" << "\\btime\\b" << "\\btimestamp\\b" << "\\btinyblob\\b"
00019 << "\\btinyint\\b" << "\\btinytext\\b" << "\\bvarbinary\\b"
00020 << "\\bvarchar\\b" << "\\byear\\b";
00021
00022 QFile file(":/dat/datafiles/keywords.dat");
00023 if (!file.open(QFile::ReadOnly));
00024 while (!file.atEnd()) {
00025 QByteArray line = file.readLine();
00026 if (!line.isEmpty())
00027 keywordPatterns << tr("%1%2%3").arg("\\b", line.trimmed(), "\\b");
00028 keywordPatterns << tr("%1%2%3").arg("\\b", line.trimmed().toUpper(), "\\b");
00029 }
00030
00031 foreach (QString pattern, keywordPatterns) {
00032 rule.pattern = QRegExp(pattern);
00033 rule.format = keywordFormat;
00034 rule.format.setFontCapitalization(QFont::AllUppercase);
00035 highlightingRules.append(rule);
00036 }
00037 classFormat.setFontWeight(QFont::Bold);
00038 classFormat.setForeground(Qt::green);
00039 classFormat.setFontCapitalization(QFont::AllUppercase);
00040 rule.pattern = QRegExp("#[^\n]*");
00041 rule.format = classFormat;
00042 highlightingRules.append(rule);
00043
00044 classFormat.setFontWeight(QFont::Bold);
00045 classFormat.setForeground(Qt::darkBlue);
00046 rule.pattern = QRegExp("$[^\n]");
00047 rule.format = classFormat;
00048 highlightingRules.append(rule);
00049
00050 braceFormat.setBackground(Qt::lightGray);
00051 rule.pattern = QRegExp("{[A-Za-z]+");
00052 rule.format = braceFormat;
00053 highlightingRules.append(rule);
00054
00055
00056 singleLineCommentFormat.setForeground(Qt::darkGreen);
00057 singleLineCommentFormat.setFontWeight(QFont::Bold);
00058 rule.pattern = QRegExp("//[^\n]*");
00059 rule.format = singleLineCommentFormat;
00060 highlightingRules.append(rule);
00061
00062 multiLineCommentFormat.setForeground(Qt::darkGreen);
00063 multiLineCommentFormat.setFontWeight(QFont::Bold);
00064 braceFormater.setForeground(Qt::magenta);
00065
00066 quotationFormat.setForeground(Qt::red);
00067 rule.pattern = QRegExp("\".*\"");
00068 rule.format = quotationFormat;
00069 highlightingRules.append(rule);
00070
00071 singleQuotationFormat.setForeground(Qt::red);
00072 rule.pattern = QRegExp("'.*'");
00073 rule.format = singleQuotationFormat;
00074 highlightingRules.append(rule);
00075
00076 singleQuotationFormat.setForeground(Qt::magenta);
00077 singleQuotationFormat.setFontWeight(QFont::Bold);
00078 singleQuotationFormat.setFontItalic(true);
00079
00080
00081
00082
00083
00084 functionFormat.setFontItalic(true);
00085 functionFormat.setForeground(Qt::blue);
00086 rule.pattern = QRegExp("\\b[A-Za-z0-9_]+(?=\\()");
00087 rule.format = functionFormat;
00088 highlightingRules.append(rule);
00089
00090 commentStartExpression = QRegExp("/\\*");
00091 commentEndExpression = QRegExp("\\*/");
00092 braceStart = QRegExp("{");
00093 braceEnd = QRegExp("}");
00094 }
00095
00096 void Highlighter::highlightBlock(const QString &text)
00097 {
00098 foreach (HighlightingRule rule, highlightingRules) {
00099 QRegExp expression(rule.pattern);
00100 int index = text.indexOf(expression);
00101 while (index >= 0) {
00102 int length = expression.matchedLength();
00103 setFormat(index, length, rule.format);
00104 index = text.indexOf(expression, index + length);
00105 }
00106 }
00107 setCurrentBlockState(0);
00108
00109 int startIndex = 0;
00110
00111 if (previousBlockState() != 1) {
00112 startIndex = text.indexOf(commentStartExpression); }
00113
00114 while (startIndex >= 0) {
00115 int endIndex = text.indexOf(commentEndExpression, startIndex);
00116 int commentLength;
00117 if (endIndex == -1) {
00118 setCurrentBlockState(1);
00119 commentLength = text.length() - startIndex;
00120 } else {
00121 commentLength = endIndex - startIndex
00122 + commentEndExpression.matchedLength();
00123 }
00124 setFormat(startIndex, commentLength, multiLineCommentFormat);
00125 startIndex = text.indexOf(commentStartExpression,
00126 startIndex + commentLength);
00127 }
00128
00129 }
00130