void ArthurFrame::showSource() { // Check for existing source if (findChild<QTextBrowser *>()) return; QString contents; if (m_sourceFileName.isEmpty()) { contents = QString("No source for widget: '%1'").arg(objectName()); } else { QFile f(m_sourceFileName); if (!f.open(QFile::ReadOnly)) contents = QString("Could not open file: '%1'").arg(m_sourceFileName); else contents = f.readAll(); } contents.replace('&', "&"); contents.replace('<', "<"); contents.replace('>', ">"); QStringList keywords; keywords << "for " << "if " << "switch " << " int " << "#include " << "const" << "void " << "uint " << "case " << "double " << "#define " << "static" << "new" << "this"; foreach (QString keyword, keywords) contents.replace(keyword, QLatin1String("<font color=olive>") + keyword + QLatin1String("</font>")); contents.replace("(int ", "(<font color=olive><b>int </b></font>"); QStringList ppKeywords; ppKeywords << "#ifdef" << "#ifndef" << "#if" << "#endif" << "#else"; foreach (QString keyword, ppKeywords) contents.replace(keyword, QLatin1String("<font color=navy>") + keyword + QLatin1String("</font>")); contents.replace(QRegExp("(\\d\\d?)"), QLatin1String("<font color=navy>\\1</font>")); QRegExp commentRe("(//.+)\\n"); commentRe.setMinimal(true); contents.replace(commentRe, QLatin1String("<font color=red>\\1</font>\n")); QRegExp stringLiteralRe("(\".+\")"); stringLiteralRe.setMinimal(true); contents.replace(stringLiteralRe, QLatin1String("<font color=green>\\1</font>")); QString html = contents; html.prepend("<html><pre>"); html.append("</pre></html>"); QTextBrowser *sourceViewer = new QTextBrowser(0); sourceViewer->setWindowTitle("Source: " + m_sourceFileName.mid(5)); sourceViewer->setParent(this, Qt::Dialog); sourceViewer->setAttribute(Qt::WA_DeleteOnClose); sourceViewer->setLineWrapMode(QTextEdit::NoWrap); sourceViewer->setHtml(html); sourceViewer->resize(600, 600); sourceViewer->show(); }