From 495c3f52faa6891f409c62e62c4fc6ea9aa82c41 Mon Sep 17 00:00:00 2001
From: hjk <qtc-committer@nokia.com>
Date: Wed, 11 Aug 2010 13:41:54 +0200
Subject: [PATCH] fakevim: improve selection interaction with main text editor

---
 src/plugins/fakevim/fakevimactions.cpp |  7 ++++
 src/plugins/fakevim/fakevimactions.h   |  2 +
 src/plugins/fakevim/fakevimhandler.cpp | 53 ++++++++++++++++++++++----
 src/plugins/fakevim/fakevimoptions.ui  | 10 +++++
 src/plugins/fakevim/fakevimplugin.cpp  |  2 +
 5 files changed, 67 insertions(+), 7 deletions(-)

diff --git a/src/plugins/fakevim/fakevimactions.cpp b/src/plugins/fakevim/fakevimactions.cpp
index a17fbe146c1..49db4d3b016 100644
--- a/src/plugins/fakevim/fakevimactions.cpp
+++ b/src/plugins/fakevim/fakevimactions.cpp
@@ -132,6 +132,13 @@ FakeVimSettings *theFakeVimSettings()
     item->setValue(false);
     instance->insertItem(ConfigReadVimRc, item);
 
+    item = new SavedAction(instance);
+    item->setValue(true);
+    item->setDefaultValue(true);
+    item->setSettingsKey(group, _("ExportSelection"));
+    item->setCheckable(true);
+    instance->insertItem(ConfigExportSelection, item);
+
     item = new SavedAction(instance);
     item->setValue(true);
     item->setDefaultValue(true);
diff --git a/src/plugins/fakevim/fakevimactions.h b/src/plugins/fakevim/fakevimactions.h
index 5929376bc68..19284391ac5 100644
--- a/src/plugins/fakevim/fakevimactions.h
+++ b/src/plugins/fakevim/fakevimactions.h
@@ -43,6 +43,8 @@ enum FakeVimSettingsCode
 {
     ConfigUseFakeVim,
     ConfigReadVimRc,
+    ConfigExportSelection,
+
     ConfigStartOfLine,
     ConfigHlSearch,
     ConfigTabStop,
diff --git a/src/plugins/fakevim/fakevimhandler.cpp b/src/plugins/fakevim/fakevimhandler.cpp
index ab8a1a23a93..f84cacd5351 100644
--- a/src/plugins/fakevim/fakevimhandler.cpp
+++ b/src/plugins/fakevim/fakevimhandler.cpp
@@ -733,6 +733,7 @@ public:
     void selectQuotedStringTextObject(bool inner, int type);
 
     Q_SLOT void importSelection();
+    void exportSelection();
     void insertInInsertMode(const QString &text);
 
 public:
@@ -1050,20 +1051,20 @@ EventResult FakeVimHandler::Private::handleEvent(QKeyEvent *ev)
     //    key = shift(key);
     //}
 
-    QTC_ASSERT(m_mode == InsertMode || m_mode == ReplaceMode
-            || !m_tc.atBlockEnd() || m_tc.block().length() <= 1,
-        qDebug() << "Cursor at EOL before key handler");
+    //QTC_ASSERT(m_mode == InsertMode || m_mode == ReplaceMode
+    //        || !m_tc.atBlockEnd() || m_tc.block().length() <= 1,
+    //    qDebug() << "Cursor at EOL before key handler");
 
     EventResult result = handleKey(Input(key, mods, ev->text()));
 
-    // the command might have destroyed the editor
+    // The command might have destroyed the editor.
     if (m_textedit || m_plaintextedit) {
         // We fake vi-style end-of-line behaviour
         m_fakeEnd = atEndOfLine() && m_mode == CommandMode && !isVisualBlockMode();
 
-        QTC_ASSERT(m_mode == InsertMode || m_mode == ReplaceMode
-                || !m_tc.atBlockEnd() || m_tc.block().length() <= 1,
-            qDebug() << "Cursor at EOL after key handler");
+        //QTC_ASSERT(m_mode == InsertMode || m_mode == ReplaceMode
+        //        || !m_tc.atBlockEnd() || m_tc.block().length() <= 1,
+        //    qDebug() << "Cursor at EOL after key handler");
 
         if (m_fakeEnd)
             moveLeft();
@@ -1075,6 +1076,8 @@ EventResult FakeVimHandler::Private::handleEvent(QKeyEvent *ev)
     if (hasConfig(ConfigShowMarks))
         updateSelection();
 
+    exportSelection();
+
     return result;
 }
 
@@ -1100,6 +1103,41 @@ void FakeVimHandler::Private::setupWidget()
     updateCursor();
 }
 
+void FakeVimHandler::Private::exportSelection()
+{
+    if (!hasConfig(ConfigExportSelection))
+        return;
+
+    // FIXME: That's hacky and does not work for block selections
+    // and the clipboard is not filled if the selections are updated
+    // using the keyboard.
+    QTextCursor tc = EDITOR(textCursor());
+    int pos = position();
+    int anc = anchor();
+    if (m_visualMode == VisualBlockMode) {
+        //tc.setPosition(anc, MoveAnchor);
+        //tc.setPosition(pos, KeepAnchor);
+        //EDITOR(setTextCursor(tc));
+    } else if (m_visualMode == VisualLineMode) {
+        int posLine = lineForPosition(pos);
+        int ancLine = lineForPosition(anc);
+        if (anc < pos) {
+            pos = lastPositionInLine(posLine);
+            anc = firstPositionInLine(ancLine);
+        } else {
+            pos = firstPositionInLine(posLine);
+            anc = lastPositionInLine(ancLine);
+        }
+        tc.setPosition(anc, MoveAnchor);
+        tc.setPosition(pos, KeepAnchor);
+        EDITOR(setTextCursor(tc));
+    } else if (m_visualMode == VisualCharMode) {
+        tc.setPosition(anc, MoveAnchor);
+        tc.setPosition(pos, KeepAnchor);
+        EDITOR(setTextCursor(tc));
+    }
+}
+
 void FakeVimHandler::Private::importSelection()
 {
     QTextCursor tc = EDITOR(textCursor());
@@ -1130,6 +1168,7 @@ void FakeVimHandler::Private::importSelection()
     tc.clearSelection();
     EDITOR(setTextCursor(tc));
     updateSelection();
+    exportSelection();
 }
 
 void FakeVimHandler::Private::updateEditor()
diff --git a/src/plugins/fakevim/fakevimoptions.ui b/src/plugins/fakevim/fakevimoptions.ui
index 450a8629065..51f19c49111 100644
--- a/src/plugins/fakevim/fakevimoptions.ui
+++ b/src/plugins/fakevim/fakevimoptions.ui
@@ -73,6 +73,16 @@
         </property>
        </widget>
       </item>
+      <item row="3" column="2">
+       <widget class="QCheckBox" name="checkBoxExportSelection">
+        <property name="text">
+         <string>Export selected text automatically</string>
+        </property>
+        <property name="toolTip">
+         <string>This might slow down editing</string>
+        </property>
+       </widget>
+      </item>
       <item row="3" column="0" colspan="2">
        <widget class="QCheckBox" name="checkBoxSmartTab">
         <property name="text">
diff --git a/src/plugins/fakevim/fakevimplugin.cpp b/src/plugins/fakevim/fakevimplugin.cpp
index 8883ada1fb8..82fab176087 100644
--- a/src/plugins/fakevim/fakevimplugin.cpp
+++ b/src/plugins/fakevim/fakevimplugin.cpp
@@ -169,6 +169,8 @@ QWidget *FakeVimOptionPage::createPage(QWidget *parent)
         m_ui.spinBoxShiftWidth);
     m_group.insert(theFakeVimSetting(ConfigShowMarks),
         m_ui.checkBoxShowMarks);
+    m_group.insert(theFakeVimSetting(ConfigExportSelection),
+        m_ui.checkBoxExportSelection);
 
     m_group.insert(theFakeVimSetting(ConfigSmartTab),
         m_ui.checkBoxSmartTab);
-- 
GitLab