forked from qt-creator/qt-creator
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: hjk <qthjk@ovi.com>
This commit is contained in:
@@ -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,6 +1804,9 @@ void FakeVimHandler::Private::exportSelection()
|
||||
QTC_CHECK(false);
|
||||
}
|
||||
} else {
|
||||
if (m_subsubmode == SearchSubSubMode && !m_searchCursor.isNull())
|
||||
setCursor(m_searchCursor);
|
||||
else
|
||||
setAnchorAndPosition(pos, pos);
|
||||
}
|
||||
m_oldExternalPosition = position();
|
||||
@@ -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();
|
||||
|
||||
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();
|
||||
|
||||
Reference in New Issue
Block a user