fakevim: consolidate transformation related code

This commit is contained in:
hjk
2010-05-06 15:20:30 +02:00
parent d110043cff
commit b4260c9a18

View File

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