From a6e5298591ff2da1482b8e4a81b3aed85d74ee6f Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Thorbj=C3=B8rn=20Lindeijer?= <thorbjorn.lindeijer@nokia.com>
Date: Tue, 15 Jun 2010 10:44:07 +0200
Subject: [PATCH] Fixed handling of text wrapping and a text layout corner case

Due to using QTextCursor::columnNumber() instead of
QTextCursor::positionInBlock(), a lot of code would not work correctly
when used with wrapped lines.

In addition, there was an issue with columnNumber() returning 0 right
after inserting a character before the last character of a line.

Reviewed-by: mae
---
 src/libs/cplusplus/MatchingText.cpp                           | 4 ++--
 src/plugins/cppeditor/cppquickfix.cpp                         | 2 +-
 src/plugins/debugger/watchutils.cpp                           | 4 ++--
 src/plugins/fakevim/fakevimhandler.cpp                        | 4 ++--
 src/plugins/qmlinspector/components/expressionquerywidget.cpp | 2 +-
 src/plugins/qmljseditor/qmlexpressionundercursor.cpp          | 2 +-
 src/plugins/qmljseditor/qmljscodecompletion.cpp               | 2 +-
 src/plugins/qmljseditor/qmljseditor.cpp                       | 2 +-
 src/plugins/texteditor/tabsettings.cpp                        | 2 +-
 9 files changed, 12 insertions(+), 12 deletions(-)

diff --git a/src/libs/cplusplus/MatchingText.cpp b/src/libs/cplusplus/MatchingText.cpp
index a20d2371ac5..55b3a6e6e7a 100644
--- a/src/libs/cplusplus/MatchingText.cpp
+++ b/src/libs/cplusplus/MatchingText.cpp
@@ -107,7 +107,7 @@ QString MatchingText::insertMatchingBrace(const QTextCursor &cursor, const QStri
     QTextDocument *doc = tc.document();
     QString text = textToProcess;
 
-    const QString blockText = tc.block().text().mid(tc.columnNumber());
+    const QString blockText = tc.block().text().mid(tc.positionInBlock());
     const int length = qMin(blockText.length(), textToProcess.length());
 
     const QChar previousChar = doc->characterAt(tc.selectionEnd() - 1);
@@ -217,7 +217,7 @@ QString MatchingText::insertParagraphSeparator(const QTextCursor &tc) const
     if (tk[index - 1].isNot(T_LBRACE))
         return QString(); // nothing to do.
 
-    const QString textBlock = tc.block().text().mid(tc.columnNumber()).trimmed();
+    const QString textBlock = tc.block().text().mid(tc.positionInBlock()).trimmed();
     if (! textBlock.isEmpty())
         return QString();
 
diff --git a/src/plugins/cppeditor/cppquickfix.cpp b/src/plugins/cppeditor/cppquickfix.cpp
index 553d443e1c9..714ba6e12a2 100644
--- a/src/plugins/cppeditor/cppquickfix.cpp
+++ b/src/plugins/cppeditor/cppquickfix.cpp
@@ -74,7 +74,7 @@ public:
     {
         _nodes.clear();
         _line = cursor.blockNumber() + 1;
-        _column = cursor.columnNumber() + 1;
+        _column = cursor.positionInBlock() + 1;
         accept(_doc->translationUnit()->ast());
         return _nodes;
     }
diff --git a/src/plugins/debugger/watchutils.cpp b/src/plugins/debugger/watchutils.cpp
index 46a69895206..99a440e9c32 100644
--- a/src/plugins/debugger/watchutils.cpp
+++ b/src/plugins/debugger/watchutils.cpp
@@ -747,11 +747,11 @@ QString cppExpressionAt(TextEditor::ITextEditor *editor, int pos,
         // Fetch the expression's code.
         CPlusPlus::ExpressionUnderCursor expressionUnderCursor;
         expr = expressionUnderCursor(tc);
-        *column = tc.columnNumber();
+        *column = tc.positionInBlock();
         *line = tc.blockNumber();
     } else {
         const QTextCursor tc = plaintext->textCursor();
-        *column = tc.columnNumber();
+        *column = tc.positionInBlock();
         *line = tc.blockNumber();
     }
 
diff --git a/src/plugins/fakevim/fakevimhandler.cpp b/src/plugins/fakevim/fakevimhandler.cpp
index 22256898c4e..c8df9217b9e 100644
--- a/src/plugins/fakevim/fakevimhandler.cpp
+++ b/src/plugins/fakevim/fakevimhandler.cpp
@@ -1464,8 +1464,8 @@ void FakeVimHandler::Private::updateSelection()
         } else if (isVisualBlockMode()) {
             QTextCursor tc = m_tc;
             tc.setPosition(anchorPos);
-            int anchorColumn = tc.columnNumber();
-            int cursorColumn = m_tc.columnNumber();
+            int anchorColumn = tc.positionInBlock();
+            int cursorColumn = m_tc.positionInBlock();
             int anchorRow    = tc.blockNumber();
             int cursorRow    = m_tc.blockNumber();
             int startColumn  = qMin(anchorColumn, cursorColumn);
diff --git a/src/plugins/qmlinspector/components/expressionquerywidget.cpp b/src/plugins/qmlinspector/components/expressionquerywidget.cpp
index 9888980ef56..e3f8a0bf19d 100644
--- a/src/plugins/qmlinspector/components/expressionquerywidget.cpp
+++ b/src/plugins/qmlinspector/components/expressionquerywidget.cpp
@@ -283,7 +283,7 @@ bool ExpressionQueryWidget::eventFilter(QObject *obj, QEvent *event)
                     bool atLastLine = !(cursor.block().next().isValid());
                     if (!atLastLine)
                         return true;
-                    if (cursor.columnNumber() <= m_prompt.count())
+                    if (cursor.positionInBlock() <= m_prompt.count())
                         return true;
                     cursor.deletePreviousChar();
                     m_expr = cursor.block().text().mid(m_prompt.count());
diff --git a/src/plugins/qmljseditor/qmlexpressionundercursor.cpp b/src/plugins/qmljseditor/qmlexpressionundercursor.cpp
index d5a82a5eccb..d6b2604eb4f 100644
--- a/src/plugins/qmljseditor/qmlexpressionundercursor.cpp
+++ b/src/plugins/qmljseditor/qmlexpressionundercursor.cpp
@@ -102,7 +102,7 @@ public:
         _cursor = cursor;
 
         QTextBlock block = _cursor.block();
-        const QString blockText = block.text().left(cursor.columnNumber());
+        const QString blockText = block.text().left(cursor.positionInBlock());
 
         scanner.setScanComments(false);
         const QList<Token> tokens = scanner(blockText, startState(block));
diff --git a/src/plugins/qmljseditor/qmljscodecompletion.cpp b/src/plugins/qmljseditor/qmljscodecompletion.cpp
index 2c67687259a..01e0228ab30 100644
--- a/src/plugins/qmljseditor/qmljscodecompletion.cpp
+++ b/src/plugins/qmljseditor/qmljscodecompletion.cpp
@@ -513,7 +513,7 @@ bool CodeCompletion::triggersCompletion(TextEditor::ITextEditable *editor)
 
             QTextCursor tc = ed->textCursor();
             QTextBlock block = tc.block();
-            const int column = tc.columnNumber();
+            const int column = tc.positionInBlock();
             const int blockState = qMax(0, block.previous().userState()) & 0xff;
             const QString blockText = block.text();
 
diff --git a/src/plugins/qmljseditor/qmljseditor.cpp b/src/plugins/qmljseditor/qmljseditor.cpp
index f8e92136d12..b06e4791a27 100644
--- a/src/plugins/qmljseditor/qmljseditor.cpp
+++ b/src/plugins/qmljseditor/qmljseditor.cpp
@@ -1130,7 +1130,7 @@ bool QmlJSTextEditor::contextAllowsAutoParentheses(const QTextCursor &cursor, co
 
     Scanner tokenize;
     const QList<Token> tokens = tokenize(blockText, blockState);
-    const int pos = cursor.columnNumber();
+    const int pos = cursor.positionInBlock();
 
     int tokenIndex = 0;
     for (; tokenIndex < tokens.size(); ++tokenIndex) {
diff --git a/src/plugins/texteditor/tabsettings.cpp b/src/plugins/texteditor/tabsettings.cpp
index 20e80446634..9c7864a9cbd 100644
--- a/src/plugins/texteditor/tabsettings.cpp
+++ b/src/plugins/texteditor/tabsettings.cpp
@@ -192,7 +192,7 @@ bool TabSettings::tabShouldIndent(const QTextDocument *document, QTextCursor cur
         return true;
     if (document->characterAt(tc.position()).isSpace()) {
         tc.movePosition(QTextCursor::WordRight);
-        if (tc.columnNumber() >= cursor.columnNumber()) {
+        if (tc.positionInBlock() >= cursor.positionInBlock()) {
             if (suggestedPosition)
                 *suggestedPosition = tc.position(); // Suggest position after whitespace
             if (m_tabKeyBehavior == TabLeadingWhitespaceIndents)
-- 
GitLab