Skip to content

Commit

Permalink
Fixes #3630
Browse files Browse the repository at this point in the history
Don't use diffModelicaFileListings when user manually edits in text view.
  • Loading branch information
adeas31 committed Feb 10, 2016
1 parent edc0f94 commit 104cbca
Show file tree
Hide file tree
Showing 12 changed files with 268 additions and 97 deletions.
73 changes: 34 additions & 39 deletions OMEdit/OMEditGUI/Debugger/Breakpoints/BreakpointMarker.cpp
Expand Up @@ -55,17 +55,15 @@ QIcon BreakpointMarker::icon() const

void BreakpointMarker::updateLineNumber(int lineNumber)
{
if (lineNumber != mpLineNumber)
{
if (lineNumber != mpLineNumber) {
mpBreakpointsTreeModel->updateBreakpoint(this, lineNumber);
mpLineNumber = lineNumber;
}
}

void BreakpointMarker::updateBlock(const QTextBlock &block)
{
if (mpLineText != block.text())
{
if (mpLineText != block.text()) {
mpLineText = block.text();
}
}
Expand All @@ -89,15 +87,14 @@ DocumentMarker::DocumentMarker(QTextDocument *doc)

bool DocumentMarker::addMark(ITextMark *mark, int line)
{
if (line >= 1)
{
if (line >= 1) {
int blockNumber = line - 1;
BaseEditorDocumentLayout *docLayout = qobject_cast<BaseEditorDocumentLayout*>(mpTextDocument->documentLayout());
if (!docLayout)
if (!docLayout) {
return false;
}
QTextBlock block = mpTextDocument->findBlockByNumber(blockNumber);
if (block.isValid())
{
if (block.isValid()) {
TextBlockUserData *userData = BaseEditorDocumentLayout::userData(block);
userData->addMark(mark);
mark->updateLineNumber(blockNumber + 1);
Expand All @@ -112,14 +109,13 @@ bool DocumentMarker::addMark(ITextMark *mark, int line)

TextMarks DocumentMarker::marksAt(int line) const
{
if (line >= 1)
{
if (line >= 1) {
int blockNumber = line - 1;
QTextBlock block = mpTextDocument->findBlockByNumber(blockNumber);
if (block.isValid())
{
if (TextBlockUserData *userData = BaseEditorDocumentLayout::testUserData(block))
if (block.isValid()) {
if (TextBlockUserData *userData = BaseEditorDocumentLayout::testUserData(block)) {
return userData->marks();
}
}
}
return TextMarks();
Expand All @@ -129,27 +125,27 @@ void DocumentMarker::removeMark(ITextMark *mark)
{
bool needUpdate = false;
QTextBlock block = mpTextDocument->begin();
while (block.isValid())
{
if (TextBlockUserData *data = static_cast<TextBlockUserData *>(block.userData()))
while (block.isValid()) {
if (TextBlockUserData *data = static_cast<TextBlockUserData *>(block.userData())) {
needUpdate |= data->removeMark(mark);
}
block = block.next();
}
if (needUpdate)
if (needUpdate) {
updateMark(0);
}
}

bool DocumentMarker::hasMark(ITextMark *mark) const
{
QTextBlock block = mpTextDocument->begin();
while (block.isValid())
{
if (TextBlockUserData *data = static_cast<TextBlockUserData *>(block.userData()))
{
if (data->hasMark(mark))
while (block.isValid()) {
if (TextBlockUserData *data = static_cast<TextBlockUserData *>(block.userData())) {
if (data->hasMark(mark)) {
return true;
}
block = block.next();
}
}
block = block.next();
}
return false;
}
Expand All @@ -164,22 +160,21 @@ void DocumentMarker::updateMark(ITextMark *mark)

void DocumentMarker::updateBreakpointsLineNumber()
{
QTextBlock block = mpTextDocument->begin();
int blockNumber = 0;
while (block.isValid()) {
if (const TextBlockUserData *userData = BaseEditorDocumentLayout::testUserData(block))
foreach (ITextMark *mrk, userData->marks()) {
mrk->updateLineNumber(blockNumber + 1);
}
block = block.next();
++blockNumber;
}
QTextBlock block = mpTextDocument->begin();
int blockNumber = 0;
while (block.isValid()) {
if (const TextBlockUserData *userData = BaseEditorDocumentLayout::testUserData(block))
foreach (ITextMark *mrk, userData->marks()) {
mrk->updateLineNumber(blockNumber + 1);
}
block = block.next();
++blockNumber;
}
}

void DocumentMarker::updateBreakpointsBlock(const QTextBlock &block)
{
if (const TextBlockUserData *userData = BaseEditorDocumentLayout::testUserData(block))
foreach (ITextMark *mrk, userData->marks())
mrk->updateBlock(block);
if (const TextBlockUserData *userData = BaseEditorDocumentLayout::testUserData(block))
foreach (ITextMark *mrk, userData->marks())
mrk->updateBlock(block);
}

5 changes: 4 additions & 1 deletion OMEdit/OMEditGUI/Editors/BaseEditor.h
Expand Up @@ -95,7 +95,7 @@ typedef QVector<Parenthesis> Parentheses;
class TextBlockUserData : public QTextBlockUserData
{
public:
inline TextBlockUserData() {}
inline TextBlockUserData() {mLeadingSpaces = -1;}
~TextBlockUserData();

inline TextMarks marks() const { return _marks; }
Expand All @@ -120,9 +120,12 @@ class TextBlockUserData : public QTextBlockUserData
static MatchType checkClosedParenthesis(QTextCursor *cursor, QChar c);
static MatchType matchCursorBackward(QTextCursor *cursor);
static MatchType matchCursorForward(QTextCursor *cursor);
inline void setLeadingSpaces(int leadingSpaces) {mLeadingSpaces = leadingSpaces;}
inline int getLeadingSpaces() {return mLeadingSpaces;}
private:
TextMarks _marks;
QVector<Parenthesis> mParentheses;
int mLeadingSpaces;
};

class BaseEditorDocumentLayout : public QPlainTextDocumentLayout
Expand Down
93 changes: 90 additions & 3 deletions OMEdit/OMEditGUI/Editors/ModelicaTextEditor.cpp
Expand Up @@ -222,6 +222,85 @@ bool ModelicaTextEditor::validateText()
return true;
}

/*!
* \brief ModelicaTextEditor::removeLeadingSpaces
* Removes the leading spaces from a nested class text to make it more readable.
* \param contents
* \return
*/
QString ModelicaTextEditor::removeLeadingSpaces(QString contents)
{
QString text;
int startLeadingSpaces = 0;
int leadingSpaces = 0;
QTextStream textStream(&contents);
int lineNumber = 1;
while (!textStream.atEnd()) {
QString currentLine = textStream.readLine();
if (lineNumber == 1) { // the first line
startLeadingSpaces = StringHandler::getLeadingSpacesSize(currentLine);
leadingSpaces = startLeadingSpaces;
} else {
leadingSpaces = qMin(startLeadingSpaces, StringHandler::getLeadingSpacesSize(currentLine));
}
text += currentLine.mid(leadingSpaces) + "\n";
lineNumber++;
}
return text;
}

/*!
* \brief ModelicaTextEditor::storeLeadingSpaces
* Stores the leading spaces information in the text block user data.
* \param leadingSpacesMap
*/
void ModelicaTextEditor::storeLeadingSpaces(QMap<int, int> leadingSpacesMap)
{
QTextBlock block = mpPlainTextEdit->document()->firstBlock();
while (block.isValid()) {
TextBlockUserData *pTextBlockUserData = BaseEditorDocumentLayout::userData(block);
if (pTextBlockUserData) {
pTextBlockUserData->setLeadingSpaces(leadingSpacesMap.value(block.blockNumber() + 1, 0));
}
block = block.next();
}
}

/*!
* \brief ModelicaTextEditor::getPlainText
* Reads the leading spaces information from the text block user data and inserts them to the actual string.
* \return
*/
QString ModelicaTextEditor::getPlainText()
{
if (mpModelWidget->getLibraryTreeItem()->isInPackageOneFile()) {
QString text;
QTextBlock block = mpPlainTextEdit->document()->firstBlock();
while (block.isValid()) {
TextBlockUserData *pTextBlockUserData = BaseEditorDocumentLayout::userData(block);
if (pTextBlockUserData) {
if (pTextBlockUserData->getLeadingSpaces() == -1) {
TextBlockUserData *pFirstBlockUserData = BaseEditorDocumentLayout::userData(mpPlainTextEdit->document()->firstBlock());
if (pFirstBlockUserData) {
pTextBlockUserData->setLeadingSpaces(pFirstBlockUserData->getLeadingSpaces());
} else {
pTextBlockUserData->setLeadingSpaces(0);
}
}
text += QString(pTextBlockUserData->getLeadingSpaces(), ' ');
}
text += block.text();
block = block.next();
if (block.isValid()) { // not last block
text += "\n";
}
}
return text;
} else {
return mpPlainTextEdit->toPlainText();
}
}

/*!
* \brief ModelicaTextEditor::showContextMenu
* Create a context menu.
Expand All @@ -241,11 +320,19 @@ void ModelicaTextEditor::showContextMenu(QPoint point)
//! @param text the string to set.
void ModelicaTextEditor::setPlainText(const QString &text)
{
if (text != mpPlainTextEdit->toPlainText()) {
QString contents = text;
if (contents != mpPlainTextEdit->toPlainText()) {
mForceSetPlainText = true;
mpPlainTextEdit->setPlainText(text);
if (mpModelWidget->getLibraryTreeItem()->isInPackageOneFile()) {
QMap<int, int> leadingSpacesMap = StringHandler::getLeadingSpaces(contents);
contents = removeLeadingSpaces(contents);
mpPlainTextEdit->setPlainText(contents);
storeLeadingSpaces(leadingSpacesMap);
} else {
mpPlainTextEdit->setPlainText(contents);
}
mForceSetPlainText = false;
mLastValidText = text;
mLastValidText = contents;
}
}

Expand Down
3 changes: 3 additions & 0 deletions OMEdit/OMEditGUI/Editors/ModelicaTextEditor.h
Expand Up @@ -79,6 +79,9 @@ class ModelicaTextEditor : public BaseEditor
QString getLastValidText() {return mLastValidText;}
QStringList getClassNames(QString *errorString);
bool validateText();
QString removeLeadingSpaces(QString contents);
void storeLeadingSpaces(QMap<int, int> leadingSpacesMap);
QString getPlainText();
private:
QString mLastValidText;
bool mTextChanged;
Expand Down
5 changes: 3 additions & 2 deletions OMEdit/OMEditGUI/Editors/TLMEditor.cpp
Expand Up @@ -156,8 +156,9 @@ QString TLMEditor::getSimulationToolStartCommand(QString name)
QDomElement subModel = subModelList.at(i).toElement();
if (subModel.attribute("Name").compare(name) == 0) {
return subModel.attribute("StartCommand");
}
}
}
}
return "";
}

/*!
Expand Down

0 comments on commit 104cbca

Please sign in to comment.