From 7f65b9eaa5fad1cdc91c64336aad3986aed7605e Mon Sep 17 00:00:00 2001
From: Roberto Raggi <roberto.raggi@nokia.com>
Date: Thu, 30 Apr 2009 15:01:54 +0200
Subject: [PATCH] Improved the auto indenter for QML files.

---
 src/plugins/duieditor/duieditor.cpp | 70 +++++++++++------------------
 1 file changed, 26 insertions(+), 44 deletions(-)

diff --git a/src/plugins/duieditor/duieditor.cpp b/src/plugins/duieditor/duieditor.cpp
index ec658d9ac67..5cdaa3aaac3 100644
--- a/src/plugins/duieditor/duieditor.cpp
+++ b/src/plugins/duieditor/duieditor.cpp
@@ -324,64 +324,46 @@ void ScriptEditor::setFontSettings(const TextEditor::FontSettings &fs)
 
 bool ScriptEditor::isElectricCharacter(const QChar &ch) const
 {
-    if (ch == QLatin1Char('{') || ch == QLatin1Char('}'))
+    if (ch == QLatin1Char('}'))
         return true;
     return false;
 }
 
-    // Indent a code line based on previous
-template <class Iterator>
-static void indentScriptBlock(const TextEditor::TabSettings &ts,
-                              const QTextBlock &block,
-                              const Iterator &programBegin,
-                              const Iterator &programEnd,
-                              QChar typedChar)
+void ScriptEditor::indentBlock(QTextDocument *, QTextBlock block, QChar typedChar)
 {
-    typedef typename SharedTools::Indenter<Iterator> Indenter ;
-    Indenter &indenter = Indenter::instance();
-    indenter.setTabSize(ts.m_tabSize);
-    indenter.setIndentSize(ts.m_indentSize);
-    const TextEditor::TextBlockIterator current(block);
-    const int indent = indenter.indentForBottomLine(current, programBegin,
-                                                    programEnd, typedChar);
-    ts.indentLine(block, indent);
-}
-
-void ScriptEditor::indentBlock(QTextDocument *doc, QTextBlock block, QChar typedChar)
-{
-#if 0
-    const TextEditor::TextBlockIterator begin(doc->begin());
-    const TextEditor::TextBlockIterator end(block.next());
-    indentScriptBlock(tabSettings(), block, begin, end, typedChar);
-#else
-    Q_UNUSED(doc)
-    Q_UNUSED(typedChar)
-
     TextEditor::TabSettings ts = tabSettings();
-    const int tabSize = qMax(1, ts.m_tabSize);
+
+    if (typedChar == QLatin1Char('}')) {
+        QTextCursor tc = textCursor();
+        if (TextEditor::TextBlockUserData::findPreviousBlockOpenParenthesis(&tc)) {
+            const QString text = tc.block().text();
+            ts.indentLine(block, ts.lineIndentPosition(text));
+            return;
+        }
+    }
 
     int indent = 0;
+    int extraIndent = 0;
+
+    if (block.previous().isValid()) {
+        const int braceDepth = qMax(0, block.previous().userState() >> 8);
+        const int previousBraceDepth = qMax(0, block.previous().previous().userState() >> 8);
+
+        if (braceDepth > previousBraceDepth)
+            extraIndent = ts.m_indentSize * (braceDepth - previousBraceDepth);
+    }
+
     QTextBlock it = block.previous();
     for (; it.isValid(); it = it.previous()) {
-        const QString blockText = it.text();
-
-        if (! blockText.isEmpty()) {
-            for (int i = 0; i < blockText.length(); ++i) {
-                const QChar ch = blockText.at(i);
-    
-                if (ch == QLatin1Char('\t'))
-                    indent += (indent + tabSize) % tabSize;
-                else if (ch.isSpace())
-                    ++indent;
-                else
-                    break;
-            }
+        const QString text = it.text();
 
+        if (! text.isEmpty()) {
+            indent = ts.lineIndentPosition(text);
             break;
         }
     }
-    ts.indentLine(block, indent);
-#endif
+
+    ts.indentLine(block, extraIndent + indent);
 }
 
 TextEditor::BaseTextEditorEditable *ScriptEditor::createEditableInterface()
-- 
GitLab