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