00001
00007 #include <QtGui/QSyntaxHighlighter>
00008 #include <QtGui/QFileDialog>
00009
00010 #include "HSyntaxHighlighter.h"
00011 #include "HSyntaxHighlighterDialog.h"
00012
00013 HSyntaxHighlighter::HSyntaxHighlighter(QObject * parent) : QSyntaxHighlighter(parent)
00014 {
00015 settings.loadConfig();
00016 }
00017 HSyntaxHighlighter::HSyntaxHighlighter(QTextDocument * parent) : QSyntaxHighlighter(parent)
00018 {
00019 settings.loadConfig();
00020 }
00021 HSyntaxHighlighter::HSyntaxHighlighter(QTextEdit * parent) : QSyntaxHighlighter(parent)
00022 {
00023 settings.loadConfig();
00024 }
00025
00026 void HSyntaxHighlighter::highlightBlock(const QString &text)
00027 {
00028 if(settings.changed())
00029 updateRules();
00030 foreach (slFormatingRule rule, sRules) {
00031 int index = text.indexOf(rule.exp);
00032 while (index >= 0) {
00033 int length = rule.exp.matchedLength();
00034 if(length==0)
00035 break;
00036 setFormat(index, length, rule.format);
00037 index = text.indexOf(rule.exp, index + length);
00038 }
00039 }
00040
00041 for (int i = 0; i < mRules.size(); ++i) {
00042 setCurrentBlockState(0);
00043 int startIndex = 0;
00044 if (previousBlockState() != (i+1))
00045 startIndex = text.indexOf(mRules[i].beginingExp);
00046
00047 while (startIndex >= 0)
00048 {
00049 int endIndex = text.indexOf(mRules[i].endingExp, startIndex);
00050 int length;
00051 if (endIndex == -1) {
00052 setCurrentBlockState(i+1);
00053 length = text.length() - startIndex;
00054 } else {
00055 length = endIndex - startIndex
00056 + mRules[i].endingExp.matchedLength();
00057 }
00058 setFormat(startIndex, length, mRules[i].format);
00059 startIndex = text.indexOf(mRules[i].beginingExp,
00060 startIndex + length);
00061 if(length==0)
00062 break;
00063 }
00064 }
00065 }
00066
00067
00068 HSyntaxHighlighter::~HSyntaxHighlighter()
00069 {
00070 settings.saveConfig();
00071 }
00072
00073 void HSyntaxHighlighter::updateRules()
00074 {
00075 sRules=settings.getSingleLineRules();
00076 mRules=settings.getMultiLinesRules();
00077 settings.cached();
00078 }
00079
00080
00081 void HSyntaxHighlighter::editConfig()
00082 {
00083
00084 HSyntaxHighlighterDialog configDialog;
00085 configDialog.setSettings(settings);
00086 configDialog.exec();
00087 if(configDialog.result()==QDialog::Accepted)
00088 settings=configDialog.getSettings();
00089 this->rehighlight();
00090 }
00091 void HSyntaxHighlighter::saveConfig() const
00092 {
00093 QString fileName=
00094 QFileDialog::getSaveFileName(0,"Save highlighting settings",QCoreApplication::applicationDirPath(),"Config Files (*.ini)");
00095 if(!fileName.isEmpty())
00096 settings.saveConfig(fileName);
00097 }
00098 void HSyntaxHighlighter::loadConfig()
00099 {
00100 QString fileName=
00101 QFileDialog::getOpenFileName(0,"Load highlighting settings",QCoreApplication::applicationDirPath(),"Config Files (*.ini)");
00102 if(!fileName.isEmpty())
00103 settings.loadConfig(fileName);
00104 this->rehighlight();
00105 }