Skip to content

Commit

Permalink
Added the basic syntax highlighting code.
Browse files Browse the repository at this point in the history
git-svn-id: https://openmodelica.org/svn/OpenModelica/trunk@7154 f25d12d1-65f4-0310-ae8a-bbce733d8d8e
  • Loading branch information
adeas31 committed Nov 23, 2010
1 parent b4b4986 commit dce2c55
Show file tree
Hide file tree
Showing 15 changed files with 984 additions and 86 deletions.
2 changes: 2 additions & 0 deletions OMEdit/OMEditGUI/Helper.cpp
Expand Up @@ -47,6 +47,7 @@ QString Helper::tmpPath = QString(getenv("OPENMODELICAHOME")).append(QString("/t
// Don't randomize the path as then it becomes annoying to remove all dirs
QString Helper::tmpPath = QString("/tmp/OMEdit");
#endif
QString Helper::settingsFileName = QString("OMEdit-Settings.xml");
// We need to replace the back slashes(\) with forward slash(/), since QWebView baseurl doesn't handle it.
QString Helper::documentationBaseUrl = QString(getenv("OPENMODELICALIBRARY")).replace("\\", "/").append(QString("/Modelica/Images/"));
QString Helper::readOnly = QString("Read-Only");
Expand All @@ -64,6 +65,7 @@ int Helper::treeIndentation = 13;
QSize Helper::iconSize = QSize(20, 20);
QSize Helper::buttonIconSize = QSize(20, 20);
int Helper::headingFontSize = 18;
int Helper::tabWidth = 20;

QString Helper::ModelicaSimulationMethods = "DASSL,DASSL2,Euler,Runge-Kutta";

Expand Down
2 changes: 2 additions & 0 deletions OMEdit/OMEditGUI/Helper.h
Expand Up @@ -49,6 +49,7 @@ class Helper
static QString omFileTypes;
static QString omFileOpenText;
static QString tmpPath;
static QString settingsFileName;
static QString documentationBaseUrl;
static QString readOnly;
static QString writeAble;
Expand All @@ -66,6 +67,7 @@ class Helper
static QSize iconSize;
static QSize buttonIconSize;
static int headingFontSize;
static int tabWidth;
};

class GUIMessages
Expand Down
196 changes: 158 additions & 38 deletions OMEdit/OMEditGUI/ModelicaEditor.cpp
Expand Up @@ -39,6 +39,7 @@ ModelicaEditor::ModelicaEditor(ProjectTab *pParent)
mpParentProjectTab = pParent;
setHorizontalScrollBarPolicy(Qt::ScrollBarAlwaysOn);
setVerticalScrollBarPolicy(Qt::ScrollBarAlwaysOn);
setTabStopWidth(Helper::tabWidth);
connect(this, SIGNAL(focusOut()), mpParentProjectTab, SLOT(ModelicaEditorTextChanged()));
}

Expand Down Expand Up @@ -67,48 +68,167 @@ QString ModelicaEditor::getModelName()

void ModelicaEditor::focusOutEvent(QFocusEvent *e)
{
if (document()->isModified())
QTextEdit::focusOutEvent(e);
// if (document()->isModified())
// {
// // if the user makes few mistakes in the text then dont let him change the perspective
// if (!emit focusOut())
// {
// MainWindow *pMainWindow = mpParentProjectTab->mpParentProjectTabWidget->mpParentMainWindow;
// QMessageBox *msgBox = new QMessageBox(pMainWindow);
// msgBox->setWindowTitle(QString(Helper::applicationName).append(" - Error"));
// msgBox->setIcon(QMessageBox::Critical);
// msgBox->setText(GUIMessages::getMessage(GUIMessages::ERROR_IN_MODELICA_TEXT)
// .arg(pMainWindow->mpOMCProxy->getResult()));
// msgBox->setText(msgBox->text().append(GUIMessages::getMessage(GUIMessages::UNDO_OR_FIX_ERRORS)));
// msgBox->addButton(tr("Undo changes"), QMessageBox::AcceptRole);
// msgBox->addButton(tr("Let me fix errors"), QMessageBox::RejectRole);

// int answer = msgBox->exec();

// switch (answer)
// {
// case QMessageBox::AcceptRole:
// document()->setModified(false);
// // revert back to last valid block
// setText(mLastValidText);
// e->accept();
// mpParentProjectTab->showIconView(true);
// break;
// case QMessageBox::RejectRole:
// document()->setModified(true);
// e->ignore();
// setFocus();
// break;
// default:
// // should never be reached
// document()->setModified(true);
// e->ignore();
// setFocus();
// break;
// }
// }
// else
// {
// qDebug() << "going back";
// e->accept();
// }
// }
// else
// {
// e->accept();
// }
}

ModelicaTextHighlighter::ModelicaTextHighlighter(ModelicaTextSettings *pSettings, QTextDocument *pParent)
: QSyntaxHighlighter(pParent)
{
mpModelicaTextSettings = pSettings;
initializeSettings();
}

void ModelicaTextHighlighter::initializeSettings()
{
QTextDocument *textDocument = dynamic_cast<QTextDocument*>(this->parent());
textDocument->setDefaultFont(QFont(mpModelicaTextSettings->getFontFamily(),
mpModelicaTextSettings->getFontSize()));

mHighlightingRules.clear();
HighlightingRule rule;

mKeywordFormat.setForeground(mpModelicaTextSettings->getKeywordRuleColor());
QStringList keywordPatterns;
keywordPatterns << "\\bextends\\b" << "\\bpublic\\b" << "\\bReal\\b" << "\\bBoolean\\b" << "\\bequation\\b"
<< "\\bvoid\\b" << "\\bend\\b";
foreach (const QString &pattern, keywordPatterns)
{
rule.mPattern = QRegExp(pattern);
rule.mFormat = mKeywordFormat;
mHighlightingRules.append(rule);
}

mTypeFormat.setForeground(mpModelicaTextSettings->getTypeRuleColor());
QStringList typePatterns;
typePatterns << "\\b" + StringHandler::getModelicaClassType(StringHandler::MODEL).toLower() + "\\b"
<< "\\b" + StringHandler::getModelicaClassType(StringHandler::CLASS).toLower() + "\\b"
<< "\\b" + StringHandler::getModelicaClassType(StringHandler::CONNECTOR).toLower() + "\\b"
<< "\\b" + StringHandler::getModelicaClassType(StringHandler::RECORD).toLower() + "\\b"
<< "\\b" + StringHandler::getModelicaClassType(StringHandler::BLOCK).toLower() + "\\b"
<< "\\b" + StringHandler::getModelicaClassType(StringHandler::FUNCTION).toLower() + "\\b"
<< "\\b" + StringHandler::getModelicaClassType(StringHandler::PACKAGE).toLower() + "\\b"
<< "\\b" + StringHandler::getModelicaClassType(StringHandler::PRIMITIVE).toLower() + "\\b"
<< "\\b" + StringHandler::getModelicaClassType(StringHandler::TYPE).toLower() + "\\b"
<< "\\b" + StringHandler::getModelicaClassType(StringHandler::PARAMETER).toLower() + "\\b"
<< "\\b" + StringHandler::getModelicaClassType(StringHandler::CONSTANT).toLower() + "\\b"
<< "\\b" + StringHandler::getModelicaClassType(StringHandler::PROTECTED).toLower() + "\\b";
foreach (const QString &pattern, typePatterns)
{
rule.mPattern = QRegExp(pattern);
rule.mFormat = mTypeFormat;
mHighlightingRules.append(rule);
}

mSingleLineCommentFormat.setForeground(mpModelicaTextSettings->getCommentRuleColor());
rule.mPattern = QRegExp("//[^\n]*");
rule.mFormat = mSingleLineCommentFormat;
mHighlightingRules.append(rule);

mMultiLineCommentFormat.setForeground(mpModelicaTextSettings->getCommentRuleColor());

mFunctionFormat.setForeground(mpModelicaTextSettings->getFunctionRuleColor());
rule.mPattern = QRegExp("\\b[A-Za-z0-9_]+(?=\\()");
rule.mFormat = mFunctionFormat;
mHighlightingRules.append(rule);

mQuotationFormat.setForeground(QColor(mpModelicaTextSettings->getQuotesRuleColor()));
rule.mPattern = QRegExp("\".*\"");
rule.mFormat = mQuotationFormat;
mHighlightingRules.append(rule);

mCommentStartExpression = QRegExp("/\\*");
mCommentEndExpression = QRegExp("\\*/");
}

void ModelicaTextHighlighter::highlightBlock(const QString &text)
{
setFormat(0, text.length(), mpModelicaTextSettings->getTextRuleColor());
foreach (const HighlightingRule &rule, mHighlightingRules)
{
// if the user makes few mistakes in the text then dont let him change the perspective
if (!emit focusOut())
QRegExp expression(rule.mPattern);
int index = expression.indexIn(text);
while (index >= 0)
{
MainWindow *pMainWindow = mpParentProjectTab->mpParentProjectTabWidget->mpParentMainWindow;
QMessageBox *msgBox = new QMessageBox(pMainWindow);
msgBox->setWindowTitle(QString(Helper::applicationName).append(" - Error"));
msgBox->setIcon(QMessageBox::Critical);
msgBox->setText(GUIMessages::getMessage(GUIMessages::ERROR_IN_MODELICA_TEXT)
.arg(pMainWindow->mpOMCProxy->getResult()));
msgBox->setText(msgBox->text().append(GUIMessages::getMessage(GUIMessages::UNDO_OR_FIX_ERRORS)));
msgBox->addButton(tr("Undo changes"), QMessageBox::AcceptRole);
msgBox->addButton(tr("Let me fix errors"), QMessageBox::RejectRole);

int answer = msgBox->exec();

switch (answer)
{
case QMessageBox::AcceptRole:
document()->setModified(false);
// revert back to last valid block
setText(mLastValidText);
e->accept();
mpParentProjectTab->showIconView(true);
break;
case QMessageBox::RejectRole:
document()->setModified(true);
e->ignore();
setFocus();
break;
default:
// should never be reached
document()->setModified(true);
e->ignore();
setFocus();
break;
}
int length = expression.matchedLength();
setFormat(index, length, rule.mFormat);
index = expression.indexIn(text, index + length);
}
}
else
setCurrentBlockState(0);

int startIndex = 0;
if (previousBlockState() != 1)
startIndex = mCommentStartExpression.indexIn(text);

while (startIndex >= 0)
{
e->accept();
int endIndex = mCommentEndExpression.indexIn(text, startIndex);
int commentLength;
if (endIndex == -1)
{
setCurrentBlockState(1);
commentLength = text.length() - startIndex;
}
else
{
commentLength = endIndex - startIndex + mCommentEndExpression.matchedLength();
}
setFormat(startIndex, commentLength, mMultiLineCommentFormat);
startIndex = mCommentStartExpression.indexIn(text, startIndex + commentLength);
}
}

void ModelicaTextHighlighter::settingsChanged()
{
initializeSettings();
rehighlight();
}
33 changes: 33 additions & 0 deletions OMEdit/OMEditGUI/ModelicaEditor.h
Expand Up @@ -53,4 +53,37 @@ class ModelicaEditor : public QTextEdit
virtual void focusOutEvent(QFocusEvent *e);
};

class ModelicaTextSettings;

class ModelicaTextHighlighter : public QSyntaxHighlighter
{
Q_OBJECT
public:
ModelicaTextHighlighter(ModelicaTextSettings *pSettings, QTextDocument *pParent = 0);
void initializeSettings();

ModelicaTextSettings *mpModelicaTextSettings;
protected:
virtual void highlightBlock(const QString &text);
private:
struct HighlightingRule
{
QRegExp mPattern;
QTextCharFormat mFormat;
};
QVector<HighlightingRule> mHighlightingRules;

QRegExp mCommentStartExpression;
QRegExp mCommentEndExpression;

QTextCharFormat mKeywordFormat;
QTextCharFormat mTypeFormat;
QTextCharFormat mFunctionFormat;
QTextCharFormat mQuotationFormat;
QTextCharFormat mSingleLineCommentFormat;
QTextCharFormat mMultiLineCommentFormat;
public slots:
void settingsChanged();
};

#endif // MODELICAEDITOR_H
46 changes: 21 additions & 25 deletions OMEdit/OMEditGUI/OMCProxy.cpp
Expand Up @@ -72,8 +72,7 @@ OMCProxy::OMCProxy(MainWindow *pParent, bool displayErrors)
// Set the Layout
QHBoxLayout *horizontallayout = new QHBoxLayout;
horizontallayout->setContentsMargins(0, 0, 0, 0);
mpExpressionTextBox = new QLineEdit;
mpExpressionTextBox->installEventFilter(this);
mpExpressionTextBox = new CustomExpressionBox(this);
mpSendButton = new QPushButton("Send");
connect(mpSendButton, SIGNAL(pressed()), SLOT(sendCustomExpression()));
horizontallayout->addWidget(mpExpressionTextBox);
Expand All @@ -96,29 +95,6 @@ OMCProxy::~OMCProxy()
delete mpOMCLogger;
}

bool OMCProxy::eventFilter(QObject *object, QEvent *event)
{
if (mpExpressionTextBox->hasFocus())
{
if (event->type() == QEvent::KeyPress)
{
if (dynamic_cast<QKeyEvent*>(event)->key() == Qt::Key_Up)
getPreviousCommand();
else if (dynamic_cast<QKeyEvent*>(event)->key() == Qt::Key_Down)
getNextCommand();
else
return QObject::eventFilter(object, event);
return true;
}
}
else
{
// standard event processing
return QObject::eventFilter(object, event);
}

}

void OMCProxy::getPreviousCommand()
{
mpExpressionTextBox->setText(mCommandsList.at(mCommandsList.count() - 1));
Expand Down Expand Up @@ -1004,3 +980,23 @@ QString OMCProxy::checkModel(QString modelName)
sendCommand("checkModel(" + modelName + ")");
return getResult();
}

CustomExpressionBox::CustomExpressionBox(OMCProxy *pParent)
{
mpParentOMCProxy = pParent;
}

void CustomExpressionBox::keyPressEvent(QKeyEvent *event)
{
switch (event->key())
{
case Qt::Key_Up:
mpParentOMCProxy->getPreviousCommand();
break;
case Qt::Key_Down:
mpParentOMCProxy->getNextCommand();
break;
default:
QLineEdit::keyPressEvent(event);
}
}
14 changes: 12 additions & 2 deletions OMEdit/OMEditGUI/OMCProxy.h
Expand Up @@ -43,6 +43,7 @@
#include "IconParameters.h"

class MainWindow;
class CustomExpressionBox;

class OMCProxy : public QObject
{
Expand All @@ -55,15 +56,14 @@ class OMCProxy : public QObject
QString mResult;
bool mDisplayErrors;
QDialog *mpOMCLogger;
QLineEdit *mpExpressionTextBox;
CustomExpressionBox *mpExpressionTextBox;
QPushButton *mpSendButton;
QTextEdit *mpTextEdit;
QString mObjectRefFile;
QList<QString> mCommandsList;
public:
OMCProxy(MainWindow *pParent = 0, bool displayErrors = true);
~OMCProxy();
virtual bool eventFilter(QObject *object, QEvent *event);
void getPreviousCommand();
void getNextCommand();

Expand Down Expand Up @@ -148,4 +148,14 @@ public slots:
void sendCustomExpression();
};

class CustomExpressionBox : public QLineEdit
{
public:
CustomExpressionBox(OMCProxy *pParent);

OMCProxy *mpParentOMCProxy;
protected:
virtual void keyPressEvent(QKeyEvent *event);
};

#endif // OMCPROXY_H

0 comments on commit dce2c55

Please sign in to comment.