From b85597da6f120c339a6c6d47611992e44fe4b1bc Mon Sep 17 00:00:00 2001
From: hjk <qtc-committer@nokia.com>
Date: Tue, 14 Sep 2010 16:58:31 +0200
Subject: [PATCH] fakevim: more selection refactoring

---
 src/plugins/fakevim/fakevimhandler.cpp | 146 ++++++++++++-------------
 1 file changed, 67 insertions(+), 79 deletions(-)

diff --git a/src/plugins/fakevim/fakevimhandler.cpp b/src/plugins/fakevim/fakevimhandler.cpp
index b952386ae57..17113432f0b 100644
--- a/src/plugins/fakevim/fakevimhandler.cpp
+++ b/src/plugins/fakevim/fakevimhandler.cpp
@@ -581,12 +581,6 @@ private:
 };
 
 
-#define WITH_CURSOR(s) do { \
-        QTextCursor tc = cursor(); \
-        s; \
-        setCursor(tc); \
-    } while (0)
-
 class FakeVimHandler::Private : public QObject
 {
     Q_OBJECT
@@ -690,55 +684,46 @@ public:
     void moveToEndOfLine();
     void moveBehindEndOfLine();
     void moveUp(int n = 1) { moveDown(-n); }
-    void moveDown(int n = 1); // { m_tc.movePosition(Down, MoveAnchor, n); }
+    void moveDown(int n = 1);
     void dump(const char *msg) const {
         qDebug() << msg << "POS: " << anchor() << position()
             << "EXT: " << m_oldExternalAnchor << m_oldExternalPosition
             << "INT: " << m_oldInternalAnchor << m_oldInternalPosition
-            << "VISUAL: " << m_visualMode
-            << "MOVEMODE: " << currentMoveMode();
+            << "VISUAL: " << m_visualMode;
     }
-    QTextCursor::MoveMode currentMoveMode() const
-        { return isVisualMode() ? KeepAnchor : MoveAnchor; }
     void moveRight(int n = 1) {
         //dump("RIGHT 1");
-        WITH_CURSOR(tc.movePosition(Right, currentMoveMode(), n));
+        QTextCursor tc = cursor();
+        tc.movePosition(Right, KeepAnchor, n);
+        setCursor(tc);
         //dump("RIGHT 2");
     }
     void moveLeft(int n = 1) {
-        WITH_CURSOR(tc.movePosition(Left, currentMoveMode(), n));
+        QTextCursor tc = cursor();
+        tc.movePosition(Left, KeepAnchor, n);
+        setCursor(tc);
     }
     void setAnchor() {
-        WITH_CURSOR(
-            int pos = tc.position();
-            tc.setPosition(pos, MoveAnchor);
-        );
+        QTextCursor tc = cursor();
+        tc.setPosition(tc.position(), MoveAnchor);
+        setCursor(tc);
     }
     void setAnchor(int position) {
-        //dump("BEGIN SET ANCHOR");
-        WITH_CURSOR(
-            tc.setPosition(tc.anchor(), MoveAnchor);
-            tc.setPosition(position, KeepAnchor);
-        );
-        //dump("END SET ANCHOR");
+        QTextCursor tc = cursor();
+        tc.setPosition(tc.anchor(), MoveAnchor);
+        tc.setPosition(position, KeepAnchor);
+        setCursor(tc);
     }
     void setPosition(int position) {
-        WITH_CURSOR(tc.setPosition(position, KeepAnchor));
-    }
-    void movePosition(int position) {
-        //dump("BEGIN MOVE POSITION");
-        if (isVisualMode())
-            setPosition(position);
-        else
-            setAnchorAndPosition(position, position);
-        //dump("END MOVE POSITION");
+        QTextCursor tc = cursor();
+        tc.setPosition(position, KeepAnchor);
+        setCursor(tc);
     }
     void setAnchorAndPosition(int anchor, int position) {
-        WITH_CURSOR(
-            tc.setPosition(anchor, MoveAnchor);
-            tc.setPosition(position, KeepAnchor);
-        );
-        //dump("SET A+P");
+        QTextCursor tc = cursor();
+        tc.setPosition(anchor, MoveAnchor);
+        tc.setPosition(position, KeepAnchor);
+        setCursor(tc);
     }
     QTextCursor cursor() const { return EDITOR(textCursor()); }
     void setCursor(const QTextCursor &tc) { EDITOR(setTextCursor(tc)); }
@@ -770,9 +755,14 @@ public:
         { UNDO_DEBUG("END EDIT BLOCK"); cursor().endEditBlock(); }
     void joinPreviousEditBlock()
         { UNDO_DEBUG("JOIN"); cursor().joinPreviousEditBlock(); }
-    void breakEditBlock()
-        { WITH_CURSOR(tc.beginEditBlock(); tc.insertText("x");
-          tc.deletePreviousChar(); tc.endEditBlock()); }
+    void breakEditBlock() {
+        QTextCursor tc = cursor();
+        tc.beginEditBlock();
+        tc.insertText("x");
+        tc.deletePreviousChar();
+        tc.endEditBlock();
+        setCursor(tc);
+    }
 
     bool isVisualMode() const { return m_visualMode != NoVisualMode; }
     bool isNoVisualMode() const { return m_visualMode == NoVisualMode; }
@@ -1112,7 +1102,9 @@ EventResult FakeVimHandler::Private::handleEvent(QKeyEvent *ev)
         }
     }
 */
-    WITH_CURSOR(tc.setVisualNavigation(true));
+    QTextCursor tc = cursor();
+    tc.setVisualNavigation(true);
+    setCursor(tc);
 
     if (m_fakeEnd)
         moveRight();
@@ -1361,7 +1353,7 @@ void FakeVimHandler::Private::moveDown(int n)
     const int targetLine = qMax(0, qMin(lastLine, block().blockNumber() + n));
     const QTextBlock &block = document()->findBlockByNumber(targetLine);
     const int pos = block.position();
-    movePosition(pos + qMax(0, qMin(block.length() - 2, col)));
+    setPosition(pos + qMax(0, qMin(block.length() - 2, col)));
     moveToTargetColumn();
 #endif
 }
@@ -1958,10 +1950,10 @@ EventResult FakeVimHandler::Private::handleCommandMode(const Input &input)
     } else if (input.is('#') || input.is('*')) {
         // FIXME: That's not proper vim behaviour
         QString needle;
-        WITH_CURSOR(
-            tc.select(QTextCursor::WordUnderCursor);
-            needle = "\\<" + tc.selection().toPlainText() + "\\>";
-        );
+        QTextCursor tc = cursor();
+        tc.select(QTextCursor::WordUnderCursor);
+        setCursor(tc);
+        needle = "\\<" + tc.selection().toPlainText() + "\\>";
         g.searchHistory.append(needle);
         m_lastSearchForward = input.is('*');
         m_currentMessage.clear();
@@ -2150,11 +2142,10 @@ EventResult FakeVimHandler::Private::handleCommandMode(const Input &input)
         if (atEndOfLine())
             moveLeft();
         m_submode = DeleteSubMode;
-        const int anchor = position();
+        setAnchor();
         moveDown(qMax(count() - 1, 0));
         m_movetype = MoveInclusive;
         moveToEndOfLine();
-        setAnchorAndPosition(anchor, position());
         setDotCommand(QString(QLatin1Char('D')));
         finishMovement();
     } else if ((input.is('D') || input.is('X')) &&
@@ -2277,15 +2268,15 @@ EventResult FakeVimHandler::Private::handleCommandMode(const Input &input)
         if (m_submode == NoSubMode) {
             for (int i = qMax(count(), 2) - 1; --i >= 0; ) {
                 moveBehindEndOfLine();
-                int anc = position();
+                setAnchor();
                 moveRight();
                 if (m_gflag) {
-                    removeText(Range(position(), anc));
+                    removeText(currentRange());
                 } else {
                     while (characterAtCursor() == ' '
                         || characterAtCursor() == '\t')
                         moveRight();
-                    removeText(Range(position(), anc));
+                    removeText(currentRange());
                     cursor().insertText(QString(QLatin1Char(' ')));
                 }
             }
@@ -2734,7 +2725,7 @@ EventResult FakeVimHandler::Private::handleInsertMode(const Input &input)
                 moveRight(prefix.size());
                 m_lastInsertion.clear(); // FIXME
             } else {
-                WITH_CURSOR(tc.deletePreviousChar());
+                cursor().deletePreviousChar();
                 fixMarks(position(), -1);
                 m_lastInsertion.chop(1);
             }
@@ -2742,7 +2733,7 @@ EventResult FakeVimHandler::Private::handleInsertMode(const Input &input)
         }
         endEditBlock();
     } else if (input.isKey(Key_Delete)) {
-        WITH_CURSOR(tc.deleteChar());
+        cursor().deleteChar();
         m_lastInsertion.clear();
     } else if (input.isKey(Key_PageDown) || input.isControl('f')) {
         removeAutomaticIndentation();
@@ -3011,8 +3002,7 @@ int FakeVimHandler::Private::readLineCode(QString &cmd)
 
 void FakeVimHandler::Private::setCurrentRange(const Range &range)
 {
-    setAnchor(range.beginPos);
-    setPosition(range.endPos);
+    setAnchorAndPosition(range.beginPos, range.endPos);
     m_rangemode = range.rangemode;
 }
 
@@ -3372,7 +3362,7 @@ bool FakeVimHandler::Private::handleExReadCommand(const ExCommand &cmd)
     file.open(QIODevice::ReadOnly);
     QTextStream ts(&file);
     QString data = ts.readAll();
-    WITH_CURSOR(tc.insertText(data));
+    insertText(data);
     endEditBlock();
     showBlackMessage(FakeVimHandler::tr("\"%1\" %2L, %3C")
         .arg(m_currentFileName).arg(data.count('\n')).arg(data.size()));
@@ -3388,8 +3378,6 @@ bool FakeVimHandler::Private::handleExBangCommand(const ExCommand &cmd) // :!
     int targetPosition = firstPositionInLine(lineForPosition(cmd.range.beginPos));
     QString command = QString(cmd.cmd.mid(1) + ' ' + cmd.args).trimmed();
     QString text = selectText(cmd.range);
-    qDebug() << "RANGE: " << cmd.range;
-    qDebug() << "TEXT: " << text;
     QProcess proc;
     proc.start(command);
     proc.waitForStarted();
@@ -3826,15 +3814,15 @@ void FakeVimHandler::Private::moveToTargetColumn()
     //int logical = logical
     const int maxcol = bl.length() - 2;
     if (m_targetColumn == -1) {
-        movePosition(bl.position() + qMax(0, maxcol));
+        setPosition(bl.position() + qMax(0, maxcol));
         return;
     }
     const int physical = logicalToPhysicalColumn(m_targetColumn, bl.text());
     //qDebug() << "CORRECTING COLUMN FROM: " << logical << "TO" << m_targetColumn;
     if (physical >= maxcol)
-        movePosition(bl.position() + qMax(0, maxcol));
+        setPosition(bl.position() + qMax(0, maxcol));
     else
-        movePosition(bl.position() + physical);
+        setPosition(bl.position() + physical);
 }
 
 /* if simple is given:
@@ -3932,11 +3920,9 @@ bool FakeVimHandler::Private::handleFfTt(QString key)
     bool forward = m_subsubdata.is('f') || m_subsubdata.is('t');
     int repeat = count();
     QTextDocument *doc = document();
-    QTextCursor tc = cursor();
-    QTextBlock block = this->block();
-    int n = block.position();
+    int n = block().position();
     if (forward)
-        n += block.length();
+        n += block().length();
     int pos = position();
     while (pos != n) {
         pos += forward ? 1 : -1;
@@ -3954,20 +3940,17 @@ bool FakeVimHandler::Private::handleFfTt(QString key)
                 ++pos;
 
             if (forward)
-                tc.movePosition(Right, KeepAnchor, pos - tc.position());
+                moveRight(pos - position());
             else
-                tc.movePosition(Left, KeepAnchor, tc.position() - pos);
+                moveLeft(position() - pos);
             break;
         }
     }
-    setCursor(tc);
     if (repeat == 0) {
         setTargetColumn();
         return true;
-    } else {
-        setPosition(oldPos);
-        return false;
     }
+    setPosition(oldPos);
     return false;
 }
 
@@ -4191,7 +4174,6 @@ void FakeVimHandler::Private::yankText(const Range &range, int toregister)
     Register &reg = g.registers[toregister];
     reg.contents = selectText(range);
     reg.rangemode = range.rangemode;
-    //qDebug() << "YANKED: " << reg.contents;
 }
 
 void FakeVimHandler::Private::transformText(const Range &range,
@@ -4278,7 +4260,7 @@ void FakeVimHandler::Private::insertText(const Register &reg)
     QTC_ASSERT(reg.rangemode == RangeCharMode,
         qDebug() << "WRONG INSERT MODE: " << reg.rangemode; return);
     fixMarks(position(), reg.contents.length());
-    WITH_CURSOR(tc.insertText(reg.contents));
+    cursor().insertText(reg.contents);
 }
 
 void FakeVimHandler::Private::removeText(const Range &range)
@@ -4349,6 +4331,7 @@ void FakeVimHandler::Private::pasteText(bool afterCursor)
             for (int i = count(); --i >= 0; ) {
                 if (afterCursor && rightDist() > 0)
                     moveRight();
+                setAnchor();
                 insertText(text);
                 if (!afterCursor && atEndOfLine())
                     moveLeft();
@@ -4363,6 +4346,7 @@ void FakeVimHandler::Private::pasteText(bool afterCursor)
             for (int i = count(); --i >= 0; ) {
                 if (afterCursor)
                     moveDown();
+                setAnchor();
                 insertText(text);
                 moveUp(lines.size() - 1);
             }
@@ -4530,9 +4514,8 @@ void FakeVimHandler::Private::undo()
     else
         showBlackMessage(QString());
 
-    if (m_undoCursorPosition.contains(rev)) {
-        WITH_CURSOR(tc.setPosition(m_undoCursorPosition[rev]));
-    }
+    if (m_undoCursorPosition.contains(rev))
+        setPosition(m_undoCursorPosition[rev]);
     setTargetColumn();
     if (atEndOfLine())
         moveLeft();
@@ -4551,9 +4534,8 @@ void FakeVimHandler::Private::redo()
     else
         showBlackMessage(QString());
 
-    if (m_undoCursorPosition.contains(rev)) {
-        WITH_CURSOR(tc.setPosition(m_undoCursorPosition[rev]));
-    }
+    if (m_undoCursorPosition.contains(rev))
+        setPosition(m_undoCursorPosition[rev]);
     setTargetColumn();
 }
 
@@ -4772,6 +4754,12 @@ int FakeVimHandler::Private::mark(int code) const
 {
     // FIXME: distinguish local and global marks.
     //qDebug() << "MARK: " << code << m_marks.value(code, -1) << m_marks;
+    if (isVisualMode()) {
+        if (code == '<')
+            return position();
+        if (code == '>')
+            return anchor();
+    }
     return m_marks.value(code, -1);
 }
 
-- 
GitLab