Commit c1755d4d authored by Lukas Holecek's avatar Lukas Holecek Committed by hjk
Browse files

fakevim: Highlight matches using Find::IFindSupport



Highlight color is taken from current color scheme and changing the text
keeps highlighted matches valid for current search.

Change-Id: I9032b48589ff0c638b04f1bcf3a0e26f422af491
Reviewed-by: default avatarhjk <qthjk@ovi.com>
parent 733d5612
......@@ -290,13 +290,11 @@ struct SearchData
{
forward = true;
highlightMatches = true;
highlightCursor = true;
}
QString needle;
bool forward;
bool highlightMatches;
bool highlightCursor;
};
// If string begins with given prefix remove it with trailing spaces and return true.
......@@ -1294,6 +1292,7 @@ public:
void notImplementedYet();
void updateMiniBuffer();
void updateSelection();
void updateHighlights();
void updateCursorShape();
QWidget *editor() const;
QTextDocument *document() const { return EDITOR(document()); }
......@@ -1479,7 +1478,7 @@ public:
QStack<CursorPosition> m_jumpListRedo;
int m_lastChangePosition;
QList<QTextEdit::ExtraSelection> m_searchSelections;
QList<QTextEdit::ExtraSelection> m_extraSelections;
QTextCursor m_searchCursor;
int m_searchStartPosition;
int m_searchFromScreenLine;
......@@ -1805,7 +1804,10 @@ void FakeVimHandler::Private::exportSelection()
QTC_CHECK(false);
}
} else {
setAnchorAndPosition(pos, pos);
if (m_subsubmode == SearchSubSubMode && !m_searchCursor.isNull())
setCursor(m_searchCursor);
else
setAnchorAndPosition(pos, pos);
}
m_oldExternalPosition = position();
m_oldExternalAnchor = anchor();
......@@ -1867,6 +1869,7 @@ void FakeVimHandler::Private::restoreWidget(int tabSize)
m_subsubmode = NoSubSubMode;
updateCursorShape();
updateSelection();
updateHighlights();
}
EventResult FakeVimHandler::Private::handleKey(const Input &input)
......@@ -2020,7 +2023,6 @@ void FakeVimHandler::Private::updateFind(bool isComplete)
SearchData sd;
sd.needle = needle;
sd.forward = m_lastSearchForward;
sd.highlightCursor = !isComplete;
sd.highlightMatches = isComplete;
search(sd, isComplete);
}
......@@ -2307,7 +2309,6 @@ void FakeVimHandler::Private::finishMovement(const QString &dotCommand)
}
resetCommandMode();
updateSelection();
}
void FakeVimHandler::Private::resetCommandMode()
......@@ -2323,15 +2324,7 @@ void FakeVimHandler::Private::resetCommandMode()
void FakeVimHandler::Private::updateSelection()
{
QList<QTextEdit::ExtraSelection> selections = m_searchSelections;
if (!m_searchCursor.isNull()) {
QTextEdit::ExtraSelection sel;
sel.cursor = m_searchCursor;
sel.format = m_searchCursor.blockCharFormat();
sel.format.setForeground(Qt::white);
sel.format.setBackground(Qt::black);
selections.append(sel);
}
QList<QTextEdit::ExtraSelection> selections = m_extraSelections;
if (hasConfig(ConfigShowMarks)) {
for (MarksIterator it(m_marks); it.hasNext(); ) {
it.next();
......@@ -2350,6 +2343,12 @@ void FakeVimHandler::Private::updateSelection()
emit q->selectionChanged(selections);
}
void FakeVimHandler::Private::updateHighlights()
{
if (!hasConfig(ConfigUseCoreSearch))
emit q->highlightMatches(m_oldNeedle);
}
void FakeVimHandler::Private::updateMiniBuffer()
{
if (!m_textedit && !m_plaintextedit)
......@@ -2555,7 +2554,6 @@ EventResult FakeVimHandler::Private::handleCommandMode(const Input &input)
finishMovement();
} else {
resetCommandMode();
updateSelection();
updateMiniBuffer();
}
} else if (m_subsubmode != NoSubSubMode) {
......@@ -2755,6 +2753,7 @@ EventResult FakeVimHandler::Private::handleCommandMode1(const Input &input)
g.searchBuffer.setPrompt(m_lastSearchForward ? '/' : '?');
m_searchStartPosition = position();
m_searchFromScreenLine = firstVisibleLine();
m_searchCursor = QTextCursor();
g.searchBuffer.clear();
updateMiniBuffer();
}
......@@ -3170,7 +3169,6 @@ EventResult FakeVimHandler::Private::handleCommandMode2(const Input &input)
setTargetColumn();
if (m_positionPastEnd)
m_visualTargetColumn = -1;
updateSelection();
} else if (input.is('o')) {
setDotCommand("%1o", count());
setUndoPosition();
......@@ -3777,14 +3775,11 @@ EventResult FakeVimHandler::Private::handleSearchSubSubMode(const Input &input)
if (input.isEscape()) {
g.currentMessage.clear();
g.searchBuffer.clear();
m_searchCursor = QTextCursor();
setPosition(m_searchStartPosition);
setAnchorAndPosition(m_searchStartPosition, m_searchStartPosition);
scrollToLine(m_searchFromScreenLine);
updateSelection();
enterCommandMode();
} else if (input.isBackspace()) {
if (g.searchBuffer.isEmpty()) {
m_searchCursor = QTextCursor();
enterCommandMode();
} else {
g.searchBuffer.deleteChar();
......@@ -3794,7 +3789,6 @@ EventResult FakeVimHandler::Private::handleSearchSubSubMode(const Input &input)
} else if (input.isKey(Key_Right)) {
g.searchBuffer.moveRight();
} else if (input.isReturn()) {
m_searchCursor = QTextCursor();
const QString &needle = g.searchBuffer.contents();
if (!needle.isEmpty()) {
updateFind(true);
......@@ -3805,7 +3799,6 @@ EventResult FakeVimHandler::Private::handleSearchSubSubMode(const Input &input)
if (g.currentMessage.isEmpty())
showMessage(MessageCommand, g.searchBuffer.display());
enterCommandMode();
highlightMatches(needle);
g.searchBuffer.clear();
} else if (input.isKey(Key_Up) || input.isKey(Key_PageUp)) {
g.searchBuffer.historyUp();
......@@ -4398,8 +4391,7 @@ bool FakeVimHandler::Private::handleExNohlsearchCommand(const ExCommand &cmd)
if (!cmd.cmd.startsWith("noh"))
return false;
m_searchSelections.clear();
updateSelection();
highlightMatches(QString());
return true;
}
......@@ -4578,7 +4570,6 @@ void FakeVimHandler::Private::searchBalanced(bool forward, QChar needle, QChar o
recordJump();
setPosition(pos);
setTargetColumn();
updateSelection();
return;
}
}
......@@ -4596,7 +4587,6 @@ void FakeVimHandler::Private::search(const SearchData &sd, bool showMessages)
int startPos = m_searchStartPosition + (sd.forward ? 1 : -1);
m_searchCursor = QTextCursor();
int repeat = count();
QTextCursor tc = document()->find(needleExp, startPos, flags);
while (!tc.isNull() && --repeat >= 1)
......@@ -4609,12 +4599,10 @@ void FakeVimHandler::Private::search(const SearchData &sd, bool showMessages)
while (!tc.isNull() && --repeat >= 1)
tc = document()->find(needleExp, tc, flags);
if (tc.isNull()) {
highlightMatches(QString());
if (showMessages) {
showMessage(MessageError,
FakeVimHandler::tr("Pattern not found: %1").arg(sd.needle));
}
updateSelection();
} else if (showMessages) {
QString msg = sd.forward
? FakeVimHandler::tr("search hit BOTTOM, continuing at TOP")
......@@ -4632,6 +4620,11 @@ void FakeVimHandler::Private::search(const SearchData &sd, bool showMessages)
if (tc.isNull()) {
tc = cursor();
tc.setPosition(m_searchStartPosition);
if (!needleExp.isValid() && showMessages) {
QString error = needleExp.errorString();
showMessage(MessageError,
FakeVimHandler::tr("Invalid regular expression: %1").arg(error));
}
}
recordJump();
......@@ -4648,14 +4641,12 @@ void FakeVimHandler::Private::search(const SearchData &sd, bool showMessages)
if (oldLine != cursorLine() - cursorLineOnScreen())
scrollToLine(cursorLine() - linesOnScreen() / 2);
if (sd.highlightCursor)
m_searchCursor = cursor();
m_searchCursor = cursor();
setTargetColumn();
if (sd.highlightMatches)
highlightMatches(sd.needle);
updateSelection();
highlightMatches(needleExp.pattern());
}
void FakeVimHandler::Private::searchNext(bool forward)
......@@ -4663,7 +4654,6 @@ void FakeVimHandler::Private::searchNext(bool forward)
SearchData sd;
sd.needle = g.searchBuffer.last();
sd.forward = forward ? m_lastSearchForward : !m_lastSearchForward;
sd.highlightCursor = false;
sd.highlightMatches = true;
m_searchStartPosition = position();
showMessage(MessageCommand, (m_lastSearchForward ? '/' : '?') + sd.needle);
......@@ -4672,40 +4662,11 @@ void FakeVimHandler::Private::searchNext(bool forward)
void FakeVimHandler::Private::highlightMatches(const QString &needle)
{
if (!hasConfig(ConfigHlSearch))
return;
if (needle == m_oldNeedle)
if (!hasConfig(ConfigHlSearch) || needle == m_oldNeedle)
return;
m_oldNeedle = needle;
m_searchSelections.clear();
if (!needle.isEmpty()) {
QTextCursor tc = cursor();
tc.movePosition(StartOfDocument, MoveAnchor);
QRegExp needleExp = vimPatternToQtPattern(needle, hasConfig(ConfigSmartCase));
if (!needleExp.isValid()) {
QString error = needleExp.errorString();
showMessage(MessageError,
FakeVimHandler::tr("Invalid regular expression: %1").arg(error));
return;
}
while (!tc.atEnd()) {
tc = tc.document()->find(needleExp, tc.position());
if (tc.isNull())
break;
if (!tc.hasSelection())
tc.movePosition(Right, KeepAnchor, 1);
QTextEdit::ExtraSelection sel;
sel.cursor = tc;
sel.format = tc.blockCharFormat();
sel.format.setBackground(QColor(177, 177, 0));
m_searchSelections.append(sel);
if (atEmptyLine(tc))
tc.movePosition(Right, MoveAnchor);
}
}
updateSelection();
updateHighlights();
}
void FakeVimHandler::Private::moveToFirstNonBlankOnLine()
......@@ -5625,7 +5586,6 @@ void FakeVimHandler::Private::toggleVisualMode(VisualMode visualMode)
const int pos = position();
setAnchorAndPosition(pos, pos);
updateMiniBuffer();
updateSelection();
}
}
......@@ -5649,7 +5609,6 @@ void FakeVimHandler::Private::leaveVisualMode()
m_visualMode = NoVisualMode;
updateMiniBuffer();
updateSelection();
}
QWidget *FakeVimHandler::Private::editor() const
......@@ -6226,7 +6185,6 @@ bool FakeVimHandler::eventFilter(QObject *ob, QEvent *ev)
QMouseEvent *mev = static_cast<QMouseEvent *>(ev);
if (mev->button() == Qt::LeftButton) {
d->m_visualMode = NoVisualMode;
d->updateSelection();
}
}
return QObject::eventFilter(ob, ev);
......
......@@ -130,6 +130,7 @@ signals:
void statusDataChanged(const QString &msg);
void extraInformationChanged(const QString &msg);
void selectionChanged(const QList<QTextEdit::ExtraSelection> &selection);
void highlightMatches(const QString &needle);
void writeAllRequested(QString *error);
void moveToMatchingParenthesis(bool *moved, bool *forward, QTextCursor *cursor);
void checkForElectricCharacter(bool *result, QChar c);
......
......@@ -70,6 +70,7 @@
#include <find/findplugin.h>
#include <find/textfindconstants.h>
#include <find/ifindsupport.h>
#include <utils/qtcassert.h>
#include <utils/savedaction.h>
......@@ -853,6 +854,7 @@ private slots:
QObject *eventFilter);
void showExtraInformation(const QString &msg);
void changeSelection(const QList<QTextEdit::ExtraSelection> &selections);
void highlightMatches(const QString &needle);
void moveToMatchingParenthesis(bool *moved, bool *forward, QTextCursor *cursor);
void checkForElectricCharacter(bool *result, QChar c);
void indentRegion(int beginLine, int endLine, QChar typedChar);
......@@ -1397,6 +1399,8 @@ void FakeVimPluginPrivate::editorOpened(IEditor *editor)
SLOT(showCommandBuffer(QString,int,int,QObject*)));
connect(handler, SIGNAL(selectionChanged(QList<QTextEdit::ExtraSelection>)),
SLOT(changeSelection(QList<QTextEdit::ExtraSelection>)));
connect(handler, SIGNAL(highlightMatches(QString)),
SLOT(highlightMatches(QString)));
connect(handler, SIGNAL(moveToMatchingParenthesis(bool*,bool*,QTextCursor*)),
SLOT(moveToMatchingParenthesis(bool*,bool*,QTextCursor*)));
connect(handler, SIGNAL(indentRegion(int,int,QChar)),
......@@ -1739,14 +1743,22 @@ void FakeVimPluginPrivate::showExtraInformation(const QString &text)
QMessageBox::information(handler->widget(), tr("FakeVim Information"), text);
}
void FakeVimPluginPrivate::changeSelection
(const QList<QTextEdit::ExtraSelection> &selection)
void FakeVimPluginPrivate::changeSelection(const QList<QTextEdit::ExtraSelection> &selection)
{
if (FakeVimHandler *handler = qobject_cast<FakeVimHandler *>(sender()))
if (BaseTextEditorWidget *bt = qobject_cast<BaseTextEditorWidget *>(handler->widget()))
bt->setExtraSelections(BaseTextEditorWidget::FakeVimSelection, selection);
}
void FakeVimPluginPrivate::highlightMatches(const QString &needle)
{
IEditor *editor = EditorManager::currentEditor();
QWidget *w = editor->widget();
Find::IFindSupport *find = Aggregation::query<Find::IFindSupport>(w);
if (find != 0)
find->highlightAll(needle, Find::FindRegularExpression);
}
int FakeVimPluginPrivate::currentFile() const
{
OpenEditorsModel *model = EditorManager::instance()->openedEditorsModel();
......
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment