From b4260c9a185ecf5ba6098b6498ab8fb8115248d7 Mon Sep 17 00:00:00 2001
From: hjk <qtc-committer@nokia.com>
Date: Thu, 6 May 2010 15:20:30 +0200
Subject: [PATCH] fakevim: consolidate transformation related code

---
 src/plugins/fakevim/fakevimhandler.cpp | 134 +++++++++++--------------
 1 file changed, 59 insertions(+), 75 deletions(-)

diff --git a/src/plugins/fakevim/fakevimhandler.cpp b/src/plugins/fakevim/fakevimhandler.cpp
index 9e82c344e5f..e79d2372684 100644
--- a/src/plugins/fakevim/fakevimhandler.cpp
+++ b/src/plugins/fakevim/fakevimhandler.cpp
@@ -636,25 +636,34 @@ public:
     int anchor() const { return m_anchor; }
     int position() const { return m_tc.position(); }
 
-    typedef void (FakeVimHandler::Private::*Transformation)(int, QTextCursor *);
-    void transformText(const Range &range, Transformation transformation);
+    struct TransformationData
+    {
+        TransformationData(const QString &s, const QVariant &d)
+            : from(s), extraData(d) {}
+        QString from;
+        QString to;
+        QVariant extraData;
+    };
+    typedef void (Private::*Transformation)(TransformationData *td);
+    void transformText(const Range &range, Transformation transformation,
+        const QVariant &extraData = QVariant());
 
     void removeSelectedText();
     void removeText(const Range &range);
-    void removeTransform(int, QTextCursor *);
+    void removeTransform(TransformationData *td);
 
     void invertCaseSelectedText();
-    void invertCaseTransform(int, QTextCursor *);
+    void invertCaseTransform(TransformationData *td);
 
     void upCaseSelectedText();
-    void upCaseTransform(int, QTextCursor *);
+    void upCaseTransform(TransformationData *td);
 
     void downCaseSelectedText();
-    void downCaseTransform(int, QTextCursor *);
+    void downCaseTransform(TransformationData *td);
 
     QString m_replacement;
     void replaceSelectedText(); // replace each character with m_replacement
-    void replaceTransform(int, QTextCursor *);
+    void replaceTransform(TransformationData *td);
 
     QString selectedText() const { return text(Range(position(), anchor())); }
     QString text(const Range &range) const;
@@ -1492,10 +1501,10 @@ EventResult FakeVimHandler::Private::handleCommandSubSubMode(const Input &input)
             m_replacement = input.text();
             finishMovement();
         } else {
-            Range range(position(), position() + count());
-            range.rangemode = RangeCharMode;
+            Range range(position(), position() + count(), RangeCharMode);
             m_replacement = input.text();
-            transformText(range, &FakeVimHandler::Private::replaceTransform);
+            Transformation tr = &FakeVimHandler::Private::replaceTransform;
+            transformText(range, tr);
             m_subsubmode = NoSubSubMode;
             m_submode = NoSubMode;
             setDotCommand("%1r" + input.text(), count());
@@ -2490,8 +2499,7 @@ EventResult FakeVimHandler::Private::handleInsertMode(const Input &input)
             const QString leftText = m_tc.block().text()
                    .left(m_tc.position() - 1 - m_tc.block().position());
             if (leftText.simplified().isEmpty()) {
-                Range range(position(), position());
-                range.rangemode = m_rangemode;
+                Range range(position(), position(), m_rangemode);
                 indentText(range, text.at(0));
             }
         }
@@ -3357,8 +3365,7 @@ void FakeVimHandler::Private::indentSelectedText(QChar typedChar)
     int beginLine = qMin(lineForPosition(position()), lineForPosition(anchor()));
     int endLine = qMax(lineForPosition(position()), lineForPosition(anchor()));
 
-    Range range(anchor(), position());
-    range.rangemode = m_rangemode;
+    Range range(anchor(), position(), m_rangemode);
     indentText(range, typedChar);
 
     setPosition(firstPositionInLine(beginLine));
@@ -3800,8 +3807,7 @@ QString FakeVimHandler::Private::text(const Range &range) const
 
 void FakeVimHandler::Private::yankSelectedText()
 {
-    Range range(anchor(), position());
-    range.rangemode = m_rangemode;
+    Range range(anchor(), position(), m_rangemode);
     yankText(range, m_register);
 }
 
@@ -3814,14 +3820,18 @@ void FakeVimHandler::Private::yankText(const Range &range, int toregister)
 }
 
 void FakeVimHandler::Private::transformText(const Range &range,
-    Transformation transformFunc)
+    Transformation transformFunc, const QVariant &extra)
 {
     QTextCursor tc = m_tc;
     switch (range.rangemode) {
         case RangeCharMode: {
             tc.setPosition(range.beginPos, MoveAnchor);
             tc.setPosition(range.endPos, KeepAnchor);
-            (this->*transformFunc)(range.beginPos, &tc);
+            TransformationData td(tc.selectedText(), extra);
+            (this->*transformFunc)(&td);
+            tc.removeSelectedText();
+            fixMarks(range.beginPos, td.to.size() - td.from.size());
+            tc.insertText(td.to);
             return;
         }
         case RangeLineMode:
@@ -3847,7 +3857,11 @@ void FakeVimHandler::Private::transformText(const Range &range,
                     tc.movePosition(Right, KeepAnchor, 1);
                 }
             }
-            (this->*transformFunc)(range.beginPos, &tc);
+            TransformationData td(tc.selectedText(), extra);
+            (this->*transformFunc)(&td);
+            tc.removeSelectedText();
+            fixMarks(range.beginPos, td.to.size() - td.from.size());
+            tc.insertText(td.to);
             return;
         }
         case RangeBlockAndTailMode:
@@ -3867,7 +3881,11 @@ void FakeVimHandler::Private::transformText(const Range &range,
                 int eCol = qMin(endColumn + 1, block.length() - 1);
                 tc.setPosition(block.position() + bCol, MoveAnchor);
                 tc.setPosition(block.position() + eCol, KeepAnchor);
-                (this->*transformFunc)(block.position() + bCol, &tc);
+                TransformationData td(tc.selectedText(), extra);
+                (this->*transformFunc)(&td);
+                tc.removeSelectedText();
+                fixMarks(block.position() + bCol, td.to.size() - td.from.size());
+                tc.insertText(td.to);
                 block = block.previous();
             }
             endEditBlock();
@@ -3877,8 +3895,7 @@ void FakeVimHandler::Private::transformText(const Range &range,
 
 void FakeVimHandler::Private::removeSelectedText()
 {
-    Range range(anchor(), position());
-    range.rangemode = m_rangemode;
+    Range range(anchor(), position(), m_rangemode);
     removeText(range);
 }
 
@@ -3887,92 +3904,60 @@ void FakeVimHandler::Private::removeText(const Range &range)
     transformText(range, &FakeVimHandler::Private::removeTransform);
 }
 
-void FakeVimHandler::Private::removeTransform(int updateMarksAfter, QTextCursor *tc)
+void FakeVimHandler::Private::removeTransform(TransformationData *td)
 {
-    fixMarks(updateMarksAfter, tc->selectionStart() - tc->selectionEnd());
-    tc->removeSelectedText();
+    Q_UNUSED(td);
 }
 
 void FakeVimHandler::Private::downCaseSelectedText()
 {
-    Range range(anchor(), position());
-    range.rangemode = m_rangemode;
+    Range range(anchor(), position(), m_rangemode);
     transformText(range, &FakeVimHandler::Private::downCaseTransform);
 }
 
-void FakeVimHandler::Private::downCaseTransform(int updateMarksAfter, QTextCursor *tc)
+void FakeVimHandler::Private::downCaseTransform(TransformationData *td)
 {
-    Q_UNUSED(updateMarksAfter);
-    QString str = tc->selectedText();
-    tc->removeSelectedText();
-    for (int i = str.size(); --i >= 0; ) {
-        QChar c = str.at(i);
-        str[i] = c.toLower();
-    }
-    tc->insertText(str);
+    td->to = td->from.toLower();
 }
 
 void FakeVimHandler::Private::upCaseSelectedText()
 {
-    Range range(anchor(), position());
-    range.rangemode = m_rangemode;
+    Range range(anchor(), position(), m_rangemode);
     transformText(range, &FakeVimHandler::Private::upCaseTransform);
 }
 
-void FakeVimHandler::Private::upCaseTransform(int updateMarksAfter, QTextCursor *tc)
+void FakeVimHandler::Private::upCaseTransform(TransformationData *td)
 {
-    Q_UNUSED(updateMarksAfter);
-    QString str = tc->selectedText();
-    tc->removeSelectedText();
-    for (int i = str.size(); --i >= 0; ) {
-        QChar c = str.at(i);
-        str[i] = c.toUpper();
-    }
-    tc->insertText(str);
+    td->to = td->from.toUpper();
 }
 
 void FakeVimHandler::Private::invertCaseSelectedText()
 {
-    Range range(anchor(), position());
-    range.rangemode = m_rangemode;
-    transformText(range, &FakeVimHandler::Private::invertCaseTransform);
+    Range range(anchor(), position(), m_rangemode);
+    transformText(range, &FakeVimHandler::Private::invertCaseTransform, QVariant());
 }
 
-void FakeVimHandler::Private::invertCaseTransform(int updateMarksAfter, QTextCursor *tc)
+void FakeVimHandler::Private::invertCaseTransform(TransformationData *td)
 {
-    Q_UNUSED(updateMarksAfter);
-    QString str = tc->selectedText();
-    tc->removeSelectedText();
-    for (int i = str.size(); --i >= 0; ) {
-        QChar c = str.at(i);
-        str[i] = c.isUpper() ? c.toLower() : c.toUpper();
-    }
-    tc->insertText(str);
+    foreach (QChar c, td->from)
+        td->to += c.isUpper() ? c.toLower() : c.toUpper();
 }
 
 void FakeVimHandler::Private::replaceSelectedText()
 {
-    Range range(anchor(), position());
-    range.rangemode = m_rangemode;
-    transformText(range, &FakeVimHandler::Private::replaceTransform);
+    Range range(anchor(), position(), m_rangemode);
+    transformText(range, &FakeVimHandler::Private::replaceTransform, QVariant());
 }
 
-void FakeVimHandler::Private::replaceTransform(int updateMarksAfter, QTextCursor *tc)
+void FakeVimHandler::Private::replaceTransform(TransformationData *td)
 {
-    beginEditBlock();
-    Q_UNUSED(updateMarksAfter);
-    QString str = tc->selectedText();
-    tc->removeSelectedText();
-    QString s;
-    for (int i = str.size(); --i >= 0; ) {
-        QChar c = str.at(i);
+    for (int i = td->from.size(); --i >= 0; ) {
+        QChar c = td->from.at(i);
         if (c.unicode() == '\n' || c.unicode() == '\0')
-            s += QLatin1Char('\n');
+            td->to += QLatin1Char('\n');
         else
-            s += m_replacement;
+            td->to += m_replacement;
     }
-    tc->insertText(s);
-    endEditBlock();
 }
 
 void FakeVimHandler::Private::pasteText(bool afterCursor)
@@ -4308,7 +4293,6 @@ void FakeVimHandler::Private::replay(const QString &command, int n)
     g.inReplay = false;
 }
 
-
 void FakeVimHandler::Private::selectWordTextObject(bool inner)
 {
     Q_UNUSED(inner); // FIXME
-- 
GitLab