From b1a024e55b3640733390ea0d68e5d896e06e2f7b Mon Sep 17 00:00:00 2001
From: mae <qt-info@nokia.com>
Date: Wed, 29 Apr 2009 16:46:54 +0200
Subject: [PATCH] some corner cases fixing

---
 src/plugins/texteditor/basetexteditor.cpp | 18 +++++++++++++-----
 src/plugins/texteditor/basetexteditor.h   |  6 ++++--
 2 files changed, 17 insertions(+), 7 deletions(-)

diff --git a/src/plugins/texteditor/basetexteditor.cpp b/src/plugins/texteditor/basetexteditor.cpp
index d44c789d6f5..e43e82a4857 100644
--- a/src/plugins/texteditor/basetexteditor.cpp
+++ b/src/plugins/texteditor/basetexteditor.cpp
@@ -2378,8 +2378,8 @@ void BaseTextEditor::extraAreaPaintEvent(QPaintEvent *e)
                     extraAreaHighlightCollapseEndBlockNumber =  d->m_highlightBlocksInfo.close.first();
                     endIsVisible = doc->findBlockByNumber(extraAreaHighlightCollapseEndBlockNumber).isVisible();
 
-                    if (TextBlockUserData::hasCollapseAfter(
-                            doc->findBlockByNumber(extraAreaHighlightCollapseBlockNumber-1))) {
+                    QTextBlock before = doc->findBlockByNumber(extraAreaHighlightCollapseBlockNumber-1);
+                    if (TextBlockUserData::hasCollapseAfter(before)) {
                             extraAreaHighlightCollapseBlockNumber--;
                     }
                 }
@@ -2698,12 +2698,15 @@ void BaseTextEditor::extraAreaMouseEvent(QMouseEvent *e)
         int collapseBoxWidth = fontMetrics().lineSpacing() + 1;
         if (e->pos().x() > extraArea()->width() - collapseBoxWidth) {
             d->extraAreaHighlightCollapseBlockNumber = cursor.blockNumber();
-            if (!TextBlockUserData::hasClosingCollapse(cursor.block()))
+            if (TextBlockUserData::canCollapse(cursor.block())
+                || !TextBlockUserData::hasClosingCollapse(cursor.block()))
                 d->extraAreaHighlightCollapseColumn = cursor.block().length()-1;
             if (!d->m_displaySettings.m_fancyFoldingBar
                 && TextBlockUserData::hasCollapseAfter(cursor.block())) {
                 d->extraAreaHighlightCollapseBlockNumber++;
-                if (!TextBlockUserData::hasClosingCollapse(cursor.block().next()))
+                d->extraAreaHighlightCollapseColumn = -1;
+                if (TextBlockUserData::canCollapse(cursor.block().next())
+                    || !TextBlockUserData::hasClosingCollapse(cursor.block().next()))
                     d->extraAreaHighlightCollapseColumn = cursor.block().next().length()-1;
             }
         }
@@ -3299,8 +3302,9 @@ bool TextBlockUserData::findPreviousBlockOpenParenthesis(QTextCursor *cursor, bo
                 if (block == cursor->block()) {
                     if (position - block.position() <= paren.pos + (paren.type == Parenthesis::Closed ? 1 : 0))
                         continue;
-                    if (checkStartPosition && paren.type == Parenthesis::Opened && position == cursor->position())
+                    if (checkStartPosition && paren.type == Parenthesis::Opened && paren.pos== cursor->position()) {
                         return true;
+                    }
                 }
                 if (paren.type == Parenthesis::Closed) {
                     ++ignore;
@@ -3820,6 +3824,10 @@ void BaseTextEditor::setDisplaySettings(const DisplaySettings &ds)
     }
 
     d->m_displaySettings = ds;
+    d->extraAreaHighlightCollapseBlockNumber = d->extraAreaHighlightCollapseColumn = -1;
+    d->m_highlightBlocksInfo = BaseTextEditorPrivateHighlightBlocks();
+    viewport()->update();
+    extraArea()->update();
 }
 
 void BaseTextEditor::setStorageSettings(const StorageSettings &storageSettings)
diff --git a/src/plugins/texteditor/basetexteditor.h b/src/plugins/texteditor/basetexteditor.h
index ca488ba1c8d..15cc8d96288 100644
--- a/src/plugins/texteditor/basetexteditor.h
+++ b/src/plugins/texteditor/basetexteditor.h
@@ -143,10 +143,12 @@ public:
 
     inline static bool hasCollapseAfter(const QTextBlock & block)
     {
+        if (!block.isValid())
+            return false;
         TextBlockUserData *data = static_cast<TextBlockUserData*>(block.userData());
         if (data && data->collapseMode() != NoCollapse) {
-            return (data->collapseMode() == CollapseAfter);
-        } else if (!data) {
+            return false;
+        } else if (block.next().isValid()) {
             data = static_cast<TextBlockUserData*>(block.next().userData());
             if (data && data->collapseMode() == TextBlockUserData::CollapseThis &&  !data->m_ifdefedOut)
                 return true;
-- 
GitLab