00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00027 #include <QtGui>
00028 #include "inspectorj/model/bytecodehighlighter.h"
00029
00030 namespace inspectorj {
00031 namespace model {
00032
00033 BytecodeHighlighter::BytecodeHighlighter(QTextDocument *parent)
00034 : QSyntaxHighlighter(parent)
00035 {
00036 HighlightingRule rule;
00037
00038 keywordFormat.setForeground(Qt::darkBlue);
00039 keywordFormat.setFontWeight(QFont::Bold);
00040
00041 QStringList keywordPatterns;
00042 keywordPatterns << "\\bchar\\b" << "\\bclass\\b" << "\\bfinal\\b"
00043 << "\\bdouble\\b" << "\\benum\\b" << "\\bextends\\b"
00044 << "\\bint\\b" << "\\bsynchronized\\b" << "\\blong\\b"
00045 << "\\bprivate\\b" << "\\bprotected\\b" << "\\bpublic\\b"
00046 << "\\bshort\\b" << "\\bsignals\\b" << "\\bsigned\\b"
00047 << "\\bstatic\\b" << "\\bstruct\\b" << "\\bimplements\\b"
00048 << "\\bunsigned\\b" << "\\bvirtual\\b" << "\\bsynthetic\\b"
00049 << "\\babstract\\b" << "\\bvoid\\b" << "\\bvolatile\\b" << "\\binterface\\b";
00050 foreach (QString pattern, keywordPatterns) {
00051 rule.pattern = QRegExp(pattern);
00052 rule.format = keywordFormat;
00053 highlightingRules.append(rule);
00054 }
00055
00056 headerFormat.setForeground(Qt::darkGreen);
00057 headerFormat.setFontWeight(QFont::Bold);
00058
00059 QStringList headers;
00060 headers << "\\bCode:" << "\\bSignature:" << "\\bLineNumberTable:"
00061 << "\\bLocalVariableTable:" << "\\bException table:" << "\\bConstant value:";
00062
00063 foreach (QString pattern, headers) {
00064 rule.pattern = QRegExp(pattern);
00065 rule.format = headerFormat;
00066 highlightingRules.append(rule);
00067 }
00068
00069 numberFormat.setForeground(Qt::blue);
00070
00071 QStringList numbers;
00072 numbers << "\\b[0-9]+\\b" << "\\b[0-9]+:" << "Bytecode generation failed."
00073 << "inspectorJ";
00074 foreach (QString pattern, numbers) {
00075 rule.pattern = QRegExp(pattern);
00076 rule.format = numberFormat;
00077 highlightingRules.append(rule);
00078 }
00079
00080 errFormat.setForeground(Qt::red);
00081 rule.pattern = QRegExp("ERROR:");
00082 rule.format = errFormat;
00083 highlightingRules.append(rule);
00084
00085 classFormat.setFontWeight(QFont::Bold);
00086 classFormat.setForeground(Qt::darkMagenta);
00087 rule.pattern = QRegExp("\\bQ[A-Za-z]+\\b");
00088 rule.format = classFormat;
00089 highlightingRules.append(rule);
00090
00091 singleLineCommentFormat.setForeground(Qt::darkYellow);
00092 rule.pattern = QRegExp("//[^\n]*");
00093 rule.format = singleLineCommentFormat;
00094 highlightingRules.append(rule);
00095
00096 multiLineCommentFormat.setForeground(Qt::darkYellow);
00097
00098 quotationFormat.setForeground(Qt::darkGreen);
00099 rule.pattern = QRegExp("\".*\"");
00100 rule.format = quotationFormat;
00101 highlightingRules.append(rule);
00102
00103 functionFormat.setFontItalic(true);
00104 functionFormat.setForeground(Qt::blue);
00105 rule.pattern = QRegExp("\\b[A-Za-z0-9_]+(?=\\()");
00106 rule.format = functionFormat;
00107 highlightingRules.append(rule);
00108
00109 commentStartExpression = QRegExp("/\\*");
00110 commentEndExpression = QRegExp("\\*/");
00111 }
00112
00113 void BytecodeHighlighter::highlightBlock(const QString &text)
00114 {
00115 foreach (HighlightingRule rule, highlightingRules) {
00116 QRegExp expression(rule.pattern);
00117 int index = text.indexOf(expression);
00118 while (index >= 0) {
00119 int length = expression.matchedLength();
00120 setFormat(index, length, rule.format);
00121 index = text.indexOf(expression, index + length);
00122 }
00123 }
00124 setCurrentBlockState(0);
00125
00126 int startIndex = 0;
00127 if (previousBlockState() != 1)
00128 startIndex = text.indexOf(commentStartExpression);
00129
00130 while (startIndex >= 0) {
00131 int endIndex = text.indexOf(commentEndExpression, startIndex);
00132 int commentLength;
00133 if (endIndex == -1) {
00134 setCurrentBlockState(1);
00135 commentLength = text.length() - startIndex;
00136 } else {
00137 commentLength = endIndex - startIndex
00138 + commentEndExpression.matchedLength();
00139 }
00140 setFormat(startIndex, commentLength, multiLineCommentFormat);
00141 startIndex = text.indexOf(commentStartExpression,
00142 startIndex + commentLength);
00143 }
00144 }
00145
00146 }
00147 }