00001
00007 #include <QtGui/QSyntaxHighlighter>
00008 #include <QtGui/QFileDialog>
00009
00010 #include "HSyntaxHighlighter.h"
00011 #include "HSyntaxHighlighterDialog.h"
00012
00017 HSyntaxHighlighter::HSyntaxHighlighter(QObject * parent) : QSyntaxHighlighter(parent)
00018 {
00019 settings.loadConfig();
00020 }
00021
00026 HSyntaxHighlighter::HSyntaxHighlighter(QTextDocument * parent) : QSyntaxHighlighter(parent)
00027 {
00028 settings.loadConfig();
00029 }
00030
00035 HSyntaxHighlighter::HSyntaxHighlighter(QTextEdit * parent) : QSyntaxHighlighter(parent)
00036 {
00037 settings.loadConfig();
00038 }
00039
00045 void HSyntaxHighlighter::highlightBlock(const QString &text)
00046 {
00047 if(settings.changed())
00048 updateRules();
00049 foreach (slFormatingRule rule, sRules) {
00050 int index = text.indexOf(rule.exp);
00051 while (index >= 0) {
00052 int length = rule.exp.matchedLength();
00053 if(length==0)
00054 break;
00055 setFormat(index, length, rule.format);
00056 index = text.indexOf(rule.exp, index + length);
00057 }
00058 }
00059
00060 setCurrentBlockState(0);
00061 for (int i = 0; i < mRules.size(); ++i) {
00062 int startIndex = 0;
00063 if (previousBlockState() != i+1)
00064 startIndex = text.indexOf(mRules[i].beginingExp);
00065
00066 while (startIndex >= 0)
00067 {
00068 int endIndex = text.indexOf(mRules[i].endingExp, startIndex);
00069 int length;
00070 if (endIndex == -1) {
00071 setCurrentBlockState(i+1);
00072 length = text.length() - startIndex;
00073 } else {
00074 length = endIndex - startIndex
00075 + mRules[i].endingExp.matchedLength();
00076
00077 }
00078 setFormat(startIndex, length, mRules[i].format);
00079 startIndex = text.indexOf(mRules[i].beginingExp,
00080 startIndex + length);
00081 if(length==0)
00082 break;
00083 }
00084 }
00085 }
00086
00090 HSyntaxHighlighter::~HSyntaxHighlighter()
00091 {
00092 settings.saveConfig();
00093 }
00094
00095 void HSyntaxHighlighter::updateRules()
00096 {
00097 sRules=settings.getSingleLineRules();
00098 mRules=settings.getMultiLinesRules();
00099 settings.cached();
00100 }
00101
00106 void HSyntaxHighlighter::editConfig()
00107 {
00108
00109 HSyntaxHighlighterDialog configDialog;
00110 configDialog.setSettings(settings);
00111 configDialog.exec();
00112 if(configDialog.result()==QDialog::Accepted)
00113 settings=configDialog.getSettings();
00114 this->rehighlight();
00115 }
00116
00120 void HSyntaxHighlighter::saveConfig() const
00121 {
00122 QString fileName=
00123 QFileDialog::getSaveFileName(0,"Save highlighting settings",QCoreApplication::applicationDirPath(),"Config Files (*.ini)");
00124 if(!fileName.isEmpty())
00125 settings.saveConfig(fileName);
00126 }
00127
00131 void HSyntaxHighlighter::loadConfig()
00132 {
00133 QString fileName=
00134 QFileDialog::getOpenFileName(0,"Load highlighting settings",QCoreApplication::applicationDirPath(),"Config Files (*.ini)");
00135 if(!fileName.isEmpty())
00136 settings.loadConfig(fileName);
00137 this->rehighlight();
00138 }