From 11d2d7447671c5aaf8e8b718df0fdf8e58f76c80 Mon Sep 17 00:00:00 2001
From: David Schulz <david.schulz@digia.com>
Date: Thu, 8 Aug 2013 08:43:04 +0200
Subject: [PATCH] Editor: Keep selection on updateCurrentSelection().

Task-number: QTCREATORBUG-9959

Change-Id: Ib3324e78bc36790e588c56af7474d3eb968032dc
Reviewed-by: Nikolai Kosjar <nikolai.kosjar@digia.com>
---
 src/plugins/texteditor/texteditorplugin.cpp | 16 +++++++++-------
 1 file changed, 9 insertions(+), 7 deletions(-)

diff --git a/src/plugins/texteditor/texteditorplugin.cpp b/src/plugins/texteditor/texteditorplugin.cpp
index ce2da09161f..5bd897625eb 100644
--- a/src/plugins/texteditor/texteditorplugin.cpp
+++ b/src/plugins/texteditor/texteditorplugin.cpp
@@ -322,19 +322,21 @@ void TextEditorPlugin::updateVariable(const QByteArray &variable)
 
 void TextEditorPlugin::updateCurrentSelection(const QString &text)
 {
-    Core::IEditor *iface = Core::EditorManager::currentEditor();
-    ITextEditor *editor = qobject_cast<ITextEditor *>(iface);
-    if (editor) {
-        int pos = editor->position();
+    if (ITextEditor *editor = qobject_cast<ITextEditor *>(Core::EditorManager::currentEditor())) {
+        const int pos = editor->position();
         int anchor = editor->position(ITextEditor::Anchor);
         if (anchor < 0) // no selection
             anchor = pos;
-        int selectionLength = anchor-pos;
-        if (selectionLength < 0)
+        int selectionLength = pos - anchor;
+        const bool selectionInTextDirection = selectionLength >= 0;
+        if (!selectionInTextDirection)
             selectionLength = -selectionLength;
-        int start = qMin(pos, anchor);
+        const int start = qMin(pos, anchor);
         editor->setCursorPosition(start);
         editor->replace(selectionLength, text);
+        const int replacementEnd = editor->position();
+        editor->setCursorPosition(selectionInTextDirection ? start : replacementEnd);
+        editor->select(selectionInTextDirection ? replacementEnd : start);
     }
 }
 
-- 
GitLab