From 5cd6ebfdfd94aa9745f2ca8e92c5ed24d6bc1afa Mon Sep 17 00:00:00 2001 From: Christian Kamm <christian.d.kamm@nokia.com> Date: Wed, 8 Sep 2010 16:18:58 +0200 Subject: [PATCH] C++: Only reindent on electric characters if indent wasn't user-changed. This should make the indenter less strict and annoying for non-standard indentation styles. Reviewed-by: Roberto Raggi --- src/plugins/cppeditor/cppeditor.cpp | 10 +++++++++- src/plugins/cpptools/cppcodeformatter.cpp | 6 ++++++ src/plugins/cpptools/cppcodeformatter.h | 1 + 3 files changed, 16 insertions(+), 1 deletion(-) diff --git a/src/plugins/cppeditor/cppeditor.cpp b/src/plugins/cppeditor/cppeditor.cpp index 40294cde5ea..ec1aafc753a 100644 --- a/src/plugins/cppeditor/cppeditor.cpp +++ b/src/plugins/cppeditor/cppeditor.cpp @@ -1494,13 +1494,21 @@ bool CPPEditor::isInComment(const QTextCursor &cursor) const void CPPEditor::indentBlock(QTextDocument *doc, QTextBlock block, QChar typedChar) { Q_UNUSED(doc) - Q_UNUSED(typedChar) const TabSettings &ts = tabSettings(); CppTools::QtStyleCodeFormatter codeFormatter(ts); codeFormatter.updateStateUntil(block); const int depth = codeFormatter.indentFor(block); + + // only reindent the current line when typing electric characters if the + // indent is the same it would be if the line were empty + if (isElectricCharacter(typedChar)) { + const int newlineIndent = codeFormatter.indentForNewLineAfter(block.previous()); + if (ts.indentationColumn(block.text()) != newlineIndent) + return; + } + ts.indentLine(block, depth); } diff --git a/src/plugins/cpptools/cppcodeformatter.cpp b/src/plugins/cpptools/cppcodeformatter.cpp index a1624880889..89c9d85f5ea 100644 --- a/src/plugins/cpptools/cppcodeformatter.cpp +++ b/src/plugins/cpptools/cppcodeformatter.cpp @@ -470,6 +470,12 @@ int CodeFormatter::indentFor(const QTextBlock &block) return m_indentDepth; } +int CodeFormatter::indentForNewLineAfter(const QTextBlock &block) +{ + restoreCurrentState(block); + return m_indentDepth; +} + void CodeFormatter::updateStateUntil(const QTextBlock &endBlock) { QStack<State> previousState = initialState(); diff --git a/src/plugins/cpptools/cppcodeformatter.h b/src/plugins/cpptools/cppcodeformatter.h index a9a9aa7e06b..e0365cb5cf2 100644 --- a/src/plugins/cpptools/cppcodeformatter.h +++ b/src/plugins/cpptools/cppcodeformatter.h @@ -69,6 +69,7 @@ public: void updateLineStateChange(const QTextBlock &block); int indentFor(const QTextBlock &block); + int indentForNewLineAfter(const QTextBlock &block); void setTabSize(int tabSize); -- GitLab