diff --git a/src/libs/cplusplus/MatchingText.cpp b/src/libs/cplusplus/MatchingText.cpp index 0e11c9c047a69159a2b6b5e8c13a010ab6d78eaf..1ee368860d5c9d14b045b0a0d7cc0e3086352f9f 100644 --- a/src/libs/cplusplus/MatchingText.cpp +++ b/src/libs/cplusplus/MatchingText.cpp @@ -30,11 +30,13 @@ #include "BackwardsScanner.h" #include <Token.h> -#include <QtDebug> + +#include <QtGui/QTextDocument> +#include <QtCore/QtDebug> using namespace CPlusPlus; -enum { MAX_NUM_LINES = 400 }; +enum { MAX_NUM_LINES = 20 }; static bool maybeOverrideChar(const QChar &ch) { @@ -160,6 +162,28 @@ QString MatchingText::insertMatchingBrace(const QTextCursor &cursor, const QStri return result; } +bool MatchingText::shouldInsertNewline(const QTextCursor &tc) const +{ + QTextDocument *doc = tc.document(); + int pos = tc.selectionEnd(); + + // count the number of empty lines. + int newlines = 0; + for (int e = doc->characterCount(); pos != e; ++pos) { + const QChar ch = doc->characterAt(pos); + + if (! ch.isSpace()) + break; + else if (ch == QChar::ParagraphSeparator) + ++newlines; + } + + if (newlines <= 1 && doc->characterAt(pos) != QLatin1Char('}')) + return true; + + return false; +} + QString MatchingText::insertParagraphSeparator(const QTextCursor &tc) const { BackwardsScanner tk(tc, QString(), MAX_NUM_LINES); @@ -189,8 +213,15 @@ QString MatchingText::insertParagraphSeparator(const QTextCursor &tc) const if (current.is(T_EOF_SYMBOL)) break; - else if (current.is(T_CLASS) || current.is(T_STRUCT) || current.is(T_UNION)) - return QLatin1String("};"); // found a class key. + else if (current.is(T_CLASS) || current.is(T_STRUCT) || current.is(T_UNION)) { + // found a class key. + QString str = QLatin1String("};"); + + if (shouldInsertNewline(tc)) + str += QLatin1Char('\n'); + + return str; + } else if (current.is(T_NAMESPACE)) return QLatin1String("}"); // found a namespace declaration @@ -250,7 +281,12 @@ QString MatchingText::insertParagraphSeparator(const QTextCursor &tc) const } // if we reached this point there is a good chance that we are parsing a function definition - return QLatin1String("}"); + QString str = QLatin1String("}"); + + if (shouldInsertNewline(tc)) + str += QLatin1Char('\n'); + + return str; } // match the block diff --git a/src/libs/cplusplus/MatchingText.h b/src/libs/cplusplus/MatchingText.h index bfb21aa68d6944266803dbc07dca01925273f88e..cd3d59c5c16dadbd092d33ddaf33d5468530ce5b 100644 --- a/src/libs/cplusplus/MatchingText.h +++ b/src/libs/cplusplus/MatchingText.h @@ -44,6 +44,9 @@ public: QString insertMatchingBrace(const QTextCursor &tc, const QString &text, const QChar &la, int *skippedChars) const; QString insertParagraphSeparator(const QTextCursor &tc) const; + +private: + bool shouldInsertNewline(const QTextCursor &tc) const; }; } // end of namespace CPlusPlus