From f269031b5e147106eb1cea54c2ee390cb072bebe Mon Sep 17 00:00:00 2001
From: mae <qt-info@nokia.com>
Date: Wed, 9 Sep 2009 13:55:11 +0200
Subject: [PATCH] Make indentation/tabbing more developer friendly: - when
 doing backspace, preserve the previous indentation litterally - when having
 auto-indentation turned off, simply repeat the previous   indentation
 litterally instead of jumping to 0

---
 src/plugins/texteditor/basetexteditor.cpp | 22 ++++++++++++----------
 src/plugins/texteditor/tabsettings.cpp    |  6 ++++++
 src/plugins/texteditor/tabsettings.h      |  1 +
 3 files changed, 19 insertions(+), 10 deletions(-)

diff --git a/src/plugins/texteditor/basetexteditor.cpp b/src/plugins/texteditor/basetexteditor.cpp
index 59c55fcb2d4..a675ea4e8bc 100644
--- a/src/plugins/texteditor/basetexteditor.cpp
+++ b/src/plugins/texteditor/basetexteditor.cpp
@@ -887,13 +887,18 @@ void BaseTextEditor::keyPressEvent(QKeyEvent *e)
         QTextCursor cursor = textCursor();
         if (d->m_inBlockSelectionMode)
             cursor.clearSelection();
-        if (d->m_document->tabSettings().m_autoIndent) {
+        const TabSettings &ts = d->m_document->tabSettings();
+        if (ts.m_autoIndent) {
             cursor.beginEditBlock();
             cursor.insertBlock();
             indent(document(), cursor, QChar::Null);
             cursor.endEditBlock();
         } else {
+            cursor.beginEditBlock();
+            QString previousBlockText = cursor.block().text();
             cursor.insertBlock();
+            cursor.insertText(ts.indentationString(previousBlockText));
+            cursor.endEditBlock();
         }
         e->accept();
         setTextCursor(cursor);
@@ -3189,17 +3194,14 @@ void BaseTextEditor::handleBackspaceKey()
             continue;
         previousIndent = tabSettings.columnAt(previousNonEmptyBlockText,
                                               tabSettings.firstNonSpace(previousNonEmptyBlockText));
-        if (previousIndent < indent)
+        if (previousIndent < indent) {
+            cursor.beginEditBlock();
+            cursor.setPosition(currentBlock.position(), QTextCursor::KeepAnchor);
+            cursor.insertText(tabSettings.indentationString(previousNonEmptyBlockText));
+            cursor.endEditBlock();
             break;
+        }
     }
-
-    if (previousIndent >= indent)
-        previousIndent = 0;
-
-    cursor.beginEditBlock();
-    cursor.setPosition(currentBlock.position(), QTextCursor::KeepAnchor);
-    cursor.insertText(tabSettings.indentationString(0, previousIndent));
-    cursor.endEditBlock();
 }
 
 void BaseTextEditor::wheelEvent(QWheelEvent *e)
diff --git a/src/plugins/texteditor/tabsettings.cpp b/src/plugins/texteditor/tabsettings.cpp
index e0225ce8bcd..1c20ab7b904 100644
--- a/src/plugins/texteditor/tabsettings.cpp
+++ b/src/plugins/texteditor/tabsettings.cpp
@@ -110,6 +110,12 @@ int TabSettings::firstNonSpace(const QString &text) const
     return i;
 }
 
+QString TabSettings::indentationString(const QString &text) const
+{
+    return text.left(firstNonSpace(text));
+}
+
+
 int TabSettings::trailingWhitespaces(const QString &text) const
 {
     int i = 0;
diff --git a/src/plugins/texteditor/tabsettings.h b/src/plugins/texteditor/tabsettings.h
index ec2c3dfe8ea..2fbede49502 100644
--- a/src/plugins/texteditor/tabsettings.h
+++ b/src/plugins/texteditor/tabsettings.h
@@ -63,6 +63,7 @@ struct TEXTEDITOR_EXPORT TabSettings
     int spacesLeftFromPosition(const QString &text, int position) const;
     int indentedColumn(int column, bool doIndent = true) const;
     QString indentationString(int startColumn, int targetColumn) const;
+    QString indentationString(const QString &text) const;
 
     void indentLine(QTextBlock block, int newIndent) const;
 
-- 
GitLab