Core: Streamline SearchResultWindow interface

That is, make SearchResultItem the one data type for adding search
results.
This will allow us to add additional properties to search results
without adding more and more parameters to a bunch of functions.

Change-Id: Ic2740477ae47449cee75caa2525727fe2b460f91
Reviewed-by: Eike Ziller <eike.ziller@qt.io>
This commit is contained in:
Christian Kandeler
2021-02-11 16:22:48 +01:00
parent fa5fdef6e1
commit d3deefc3a4
17 changed files with 136 additions and 157 deletions

View File

@@ -3118,14 +3118,14 @@ void EditorManager::openEditorAtSearchResult(const SearchResultItem &item,
OpenEditorFlags flags, OpenEditorFlags flags,
bool *newEditor) bool *newEditor)
{ {
if (item.path.empty()) { if (item.path().empty()) {
openEditor(QDir::fromNativeSeparators(item.text), editorId, flags, newEditor); openEditor(QDir::fromNativeSeparators(item.lineText()), editorId, flags, newEditor);
return; return;
} }
openEditorAt(QDir::fromNativeSeparators(item.path.first()), openEditorAt(QDir::fromNativeSeparators(item.path().first()),
item.mainRange.begin.line, item.mainRange().begin.line,
item.mainRange.begin.column, item.mainRange().begin.column,
editorId, editorId,
flags, flags,
newEditor); newEditor);

View File

@@ -27,6 +27,7 @@
#include "searchresultcolor.h" #include "searchresultcolor.h"
#include <utils/fileutils.h>
#include <utils/hostosinfo.h> #include <utils/hostosinfo.h>
#include <QIcon> #include <QIcon>
@@ -87,16 +88,50 @@ public:
} // namespace Search } // namespace Search
class SearchResultItem class CORE_EXPORT SearchResultItem
{ {
public: public:
QStringList path; // hierarchy to the parent item of this item QStringList path() const { return m_path; }
QString text; // text to show for the item itself void setPath(const QStringList &path) { m_path = path; }
QIcon icon; // icon to show in front of the item (by be null icon to hide) void setFilePath(const Utils::FilePath &filePath)
QVariant userData; // user data for identification of the item {
Search::TextRange mainRange; m_path = QStringList{filePath.toUserOutput()};
bool useTextEditorFont = false; }
SearchResultColor::Style style = SearchResultColor::Style::Default;
QString lineText() const { return m_lineText; }
void setLineText(const QString &text) { m_lineText = text; }
QIcon icon() const { return m_icon; }
void setIcon(const QIcon &icon) { m_icon = icon; }
QVariant userData() const { return m_userData; }
void setUserData(const QVariant &userData) { m_userData = userData; }
Search::TextRange mainRange() const { return m_mainRange; }
void setMainRange(const Search::TextRange &mainRange) { m_mainRange = mainRange; }
void setMainRange(int line, int column, int length)
{
m_mainRange = {};
m_mainRange.begin.line = line;
m_mainRange.begin.column = column;
m_mainRange.end.line = m_mainRange.begin.line;
m_mainRange.end.column = m_mainRange.begin.column + length;
}
bool useTextEditorFont() const { return m_useTextEditorFont; }
void setUseTextEditorFont(bool useTextEditorFont) { m_useTextEditorFont = useTextEditorFont; }
SearchResultColor::Style style() const { return m_style; }
void setStyle(SearchResultColor::Style style) { m_style = style; }
private:
QStringList m_path; // hierarchy to the parent item of this item
QString m_lineText; // text to show for the item itself
QIcon m_icon; // icon to show in front of the item (by be null icon to hide)
QVariant m_userData; // user data for identification of the item
Search::TextRange m_mainRange;
bool m_useTextEditorFont = false;
SearchResultColor::Style m_style = SearchResultColor::Style::Default;
}; };
} // namespace Core } // namespace Core

View File

@@ -85,7 +85,7 @@ SearchResultTreeItem *SearchResultTreeItem::parent() const
static bool lessThanByText(SearchResultTreeItem *a, const QString &b) static bool lessThanByText(SearchResultTreeItem *a, const QString &b)
{ {
return a->item.text < b; return a->item.lineText() < b;
} }
int SearchResultTreeItem::insertionIndex(const QString &text, SearchResultTreeItem **existingItem) const int SearchResultTreeItem::insertionIndex(const QString &text, SearchResultTreeItem **existingItem) const
@@ -93,7 +93,7 @@ int SearchResultTreeItem::insertionIndex(const QString &text, SearchResultTreeIt
QList<SearchResultTreeItem *>::const_iterator insertionPosition = QList<SearchResultTreeItem *>::const_iterator insertionPosition =
std::lower_bound(m_children.begin(), m_children.end(), text, lessThanByText); std::lower_bound(m_children.begin(), m_children.end(), text, lessThanByText);
if (existingItem) { if (existingItem) {
if (insertionPosition != m_children.end() && (*insertionPosition)->item.text == text) if (insertionPosition != m_children.end() && (*insertionPosition)->item.lineText() == text)
(*existingItem) = (*insertionPosition); (*existingItem) = (*insertionPosition);
else else
*existingItem = nullptr; *existingItem = nullptr;
@@ -103,7 +103,7 @@ int SearchResultTreeItem::insertionIndex(const QString &text, SearchResultTreeIt
int SearchResultTreeItem::insertionIndex(const SearchResultItem &item, SearchResultTreeItem **existingItem) const int SearchResultTreeItem::insertionIndex(const SearchResultItem &item, SearchResultTreeItem **existingItem) const
{ {
return insertionIndex(item.text, existingItem); return insertionIndex(item.lineText(), existingItem);
} }
void SearchResultTreeItem::insertChild(int index, SearchResultTreeItem *child) void SearchResultTreeItem::insertChild(int index, SearchResultTreeItem *child)

View File

@@ -294,44 +294,44 @@ QVariant SearchResultTreeModel::data(const SearchResultTreeItem *row, int role)
result = row->checkState(); result = row->checkState();
break; break;
case Qt::ToolTipRole: case Qt::ToolTipRole:
result = row->item.text.trimmed(); result = row->item.lineText().trimmed();
break; break;
case Qt::FontRole: case Qt::FontRole:
if (row->item.useTextEditorFont) if (row->item.useTextEditorFont())
result = m_textEditorFont; result = m_textEditorFont;
else else
result = QVariant(); result = QVariant();
break; break;
case Qt::ForegroundRole: case Qt::ForegroundRole:
result = m_colors.value(row->item.style).textForeground; result = m_colors.value(row->item.style()).textForeground;
break; break;
case Qt::BackgroundRole: case Qt::BackgroundRole:
result = m_colors.value(row->item.style).textBackground; result = m_colors.value(row->item.style()).textBackground;
break; break;
case ItemDataRoles::ResultLineRole: case ItemDataRoles::ResultLineRole:
case Qt::DisplayRole: case Qt::DisplayRole:
result = row->item.text; result = row->item.lineText();
break; break;
case ItemDataRoles::ResultItemRole: case ItemDataRoles::ResultItemRole:
result = QVariant::fromValue(row->item); result = QVariant::fromValue(row->item);
break; break;
case ItemDataRoles::ResultBeginLineNumberRole: case ItemDataRoles::ResultBeginLineNumberRole:
result = row->item.mainRange.begin.line; result = row->item.mainRange().begin.line;
break; break;
case ItemDataRoles::ResultIconRole: case ItemDataRoles::ResultIconRole:
result = row->item.icon; result = row->item.icon();
break; break;
case ItemDataRoles::ResultHighlightBackgroundColor: case ItemDataRoles::ResultHighlightBackgroundColor:
result = m_colors.value(row->item.style).highlightBackground; result = m_colors.value(row->item.style()).highlightBackground;
break; break;
case ItemDataRoles::ResultHighlightForegroundColor: case ItemDataRoles::ResultHighlightForegroundColor:
result = m_colors.value(row->item.style).highlightForeground; result = m_colors.value(row->item.style()).highlightForeground;
break; break;
case ItemDataRoles::ResultBeginColumnNumberRole: case ItemDataRoles::ResultBeginColumnNumberRole:
result = row->item.mainRange.begin.column; result = row->item.mainRange().begin.column;
break; break;
case ItemDataRoles::SearchTermLengthRole: case ItemDataRoles::SearchTermLengthRole:
result = row->item.mainRange.length(row->item.text); result = row->item.mainRange().length(row->item.lineText());
break; break;
case ItemDataRoles::IsGeneratedRole: case ItemDataRoles::IsGeneratedRole:
result = row->isGenerated(); result = row->isGenerated();
@@ -368,8 +368,8 @@ QSet<SearchResultTreeItem *> SearchResultTreeModel::addPath(const QStringList &p
const int insertionIndex = currentItem->insertionIndex(part, &partItem); const int insertionIndex = currentItem->insertionIndex(part, &partItem);
if (!partItem) { if (!partItem) {
SearchResultItem item; SearchResultItem item;
item.path = currentPath; item.setPath(currentPath);
item.text = part; item.setLineText(part);
partItem = new SearchResultTreeItem(item, currentItem); partItem = new SearchResultTreeItem(item, currentItem);
if (m_showReplaceUI) if (m_showReplaceUI)
partItem->setCheckState(Qt::Checked); partItem->setCheckState(Qt::Checked);
@@ -423,14 +423,14 @@ void SearchResultTreeModel::addResultsToCurrentParent(const QList<SearchResultIt
static bool lessThanByPath(const SearchResultItem &a, const SearchResultItem &b) static bool lessThanByPath(const SearchResultItem &a, const SearchResultItem &b)
{ {
if (a.path.size() < b.path.size()) if (a.path().size() < b.path().size())
return true; return true;
if (a.path.size() > b.path.size()) if (a.path().size() > b.path().size())
return false; return false;
for (int i = 0; i < a.path.size(); ++i) { for (int i = 0; i < a.path().size(); ++i) {
if (a.path.at(i) < b.path.at(i)) if (a.path().at(i) < b.path().at(i))
return true; return true;
if (a.path.at(i) > b.path.at(i)) if (a.path().at(i) > b.path().at(i))
return false; return false;
} }
return false; return false;
@@ -447,15 +447,15 @@ QList<QModelIndex> SearchResultTreeModel::addResults(const QList<SearchResultIte
std::stable_sort(sortedItems.begin(), sortedItems.end(), lessThanByPath); std::stable_sort(sortedItems.begin(), sortedItems.end(), lessThanByPath);
QList<SearchResultItem> itemSet; QList<SearchResultItem> itemSet;
foreach (const SearchResultItem &item, sortedItems) { foreach (const SearchResultItem &item, sortedItems) {
m_editorFontIsUsed |= item.useTextEditorFont; m_editorFontIsUsed |= item.useTextEditorFont();
if (!m_currentParent || (m_currentPath != item.path)) { if (!m_currentParent || (m_currentPath != item.path())) {
// first add all the items from before // first add all the items from before
if (!itemSet.isEmpty()) { if (!itemSet.isEmpty()) {
addResultsToCurrentParent(itemSet, mode); addResultsToCurrentParent(itemSet, mode);
itemSet.clear(); itemSet.clear();
} }
// switch parent // switch parent
pathNodes += addPath(item.path); pathNodes += addPath(item.path());
} }
itemSet << item; itemSet << item;
} }
@@ -642,7 +642,7 @@ bool SearchResultFilterModel::filterAcceptsRow(int source_row,
return false; return false;
if (!m_filter) if (!m_filter)
return true; return true;
if (item->item.userData.isValid()) if (item->item.userData().isValid())
return m_filter->matches(item->item); return m_filter->matches(item->item);
const int childCount = sourceModel()->rowCount(idx); const int childCount = sourceModel()->rowCount(idx);
for (int i = 0; i < childCount; ++i) { for (int i = 0; i < childCount; ++i) {

View File

@@ -247,22 +247,6 @@ void SearchResultWidget::setAdditionalReplaceWidget(QWidget *widget)
m_additionalReplaceWidget = widget; m_additionalReplaceWidget = widget;
} }
void SearchResultWidget::addResult(const QString &fileName,
const QString &rowText,
Search::TextRange mainRange,
const QVariant &userData,
SearchResultColor::Style style)
{
SearchResultItem item;
item.path = QStringList({QDir::toNativeSeparators(fileName)});
item.mainRange = mainRange;
item.text = rowText;
item.useTextEditorFont = true;
item.userData = userData;
item.style = style;
addResults(QList<SearchResultItem>() << item, SearchResult::AddOrdered);
}
void SearchResultWidget::addResults(const QList<SearchResultItem> &items, SearchResult::AddMode mode) void SearchResultWidget::addResults(const QList<SearchResultItem> &items, SearchResult::AddMode mode)
{ {
bool firstItems = (m_count == 0); bool firstItems = (m_count == 0);

View File

@@ -55,11 +55,6 @@ public:
QWidget *additionalReplaceWidget() const; QWidget *additionalReplaceWidget() const;
void setAdditionalReplaceWidget(QWidget *widget); void setAdditionalReplaceWidget(QWidget *widget);
void addResult(const QString &fileName,
const QString &lineText,
Search::TextRange mainRange,
const QVariant &userData = QVariant(),
SearchResultColor::Style style = SearchResultColor::Style::Default);
void addResults(const QList<SearchResultItem> &items, SearchResult::AddMode mode); void addResults(const QList<SearchResultItem> &items, SearchResult::AddMode mode);
int count() const; int count() const;

View File

@@ -803,48 +803,18 @@ void SearchResult::setAdditionalReplaceWidget(QWidget *widget)
/*! /*!
Adds a single result line to the \uicontrol {Search Results} output pane. Adds a single result line to the \uicontrol {Search Results} output pane.
\a fileName, \a lineNumber, and \a lineText are shown on the result line. \a {item}.mainRange() specifies the region from the beginning of the search term
\a searchTermStart and \a searchTermLength specify the region that
should be visually marked (string position and length in \a lineText).
You can attach arbitrary \a userData to the search result, which can
be used, for example, when reacting to the signals of the search results
for your search.
\sa addResults()
*/
void SearchResult::addResult(const QString &fileName, int lineNumber, const QString &lineText,
int searchTermStart, int searchTermLength, const QVariant &userData,
SearchResultColor::Style style)
{
Search::TextRange mainRange;
mainRange.begin.line = lineNumber;
mainRange.begin.column = searchTermStart;
mainRange.end.line = mainRange.begin.line;
mainRange.end.column = mainRange.begin.column + searchTermLength;
m_widget->addResult(fileName, lineText, mainRange, userData, style);
}
/*!
Adds a single result line to the \uicontrol {Search Results} output pane.
\a mainRange specifies the region from the beginning of the search term
through its length that should be visually marked. through its length that should be visually marked.
\a fileName and \a lineText are shown on the result line. \a {item}.path(), \a {item}.text() are shown on the result line.
You can attach arbitrary \a userData to the search result, which can You can attach arbitrary \a {item}.userData() to the search result, which can
be used, for example, when reacting to the signals of the search results be used, for example, when reacting to the signals of the search results
for your search. for your search.
\sa addResults() \sa addResults()
*/ */
void SearchResult::addResult(const QString &fileName, void SearchResult::addResult(const SearchResultItem &item)
const QString &lineText,
Search::TextRange mainRange,
const QVariant &userData,
SearchResultColor::Style style)
{ {
m_widget->addResult(fileName, lineText, mainRange, userData, style); m_widget->addResults({item}, AddSorted);
emit countChanged(m_widget->count());
} }
/*! /*!

View File

@@ -76,18 +76,7 @@ public:
void setAdditionalReplaceWidget(QWidget *widget); void setAdditionalReplaceWidget(QWidget *widget);
public slots: public slots:
void addResult(const QString &fileName, void addResult(const SearchResultItem &item);
int lineNumber,
const QString &lineText,
int searchTermStart,
int searchTermLength,
const QVariant &userData = QVariant(),
SearchResultColor::Style style = SearchResultColor::Style::Default);
void addResult(const QString &fileName,
const QString &lineText,
Search::TextRange mainRange,
const QVariant &userData = QVariant(),
SearchResultColor::Style style = SearchResultColor::Style::Default);
void addResults(const QList<SearchResultItem> &items, AddMode mode); void addResults(const QList<SearchResultItem> &items, AddMode mode);
void setFilter(SearchResultFilter *filter); // Takes ownership void setFilter(SearchResultFilter *filter); // Takes ownership
void finishSearch(bool canceled); void finishSearch(bool canceled);

View File

@@ -417,7 +417,11 @@ static void addSearchResults(CppTools::Usages usages, SearchResult &search, cons
if (!lineContent.isEmpty()) { if (!lineContent.isEmpty()) {
Search::TextRange range{Search::TextPosition(usage.line, usage.column - 1), Search::TextRange range{Search::TextPosition(usage.line, usage.column - 1),
Search::TextPosition(usage.line, usage.column + text.length() - 1)}; Search::TextPosition(usage.line, usage.column + text.length() - 1)};
search.addResult(usage.path, lineContent, range); SearchResultItem item;
item.setFilePath(FilePath::fromString(usage.path));
item.setLineText(lineContent);
item.setMainRange(range);
search.addResult(item);
} }
} }
} }

View File

@@ -308,10 +308,10 @@ public:
} }
Core::SearchResultItem item; Core::SearchResultItem item;
item.path = scope.split(QLatin1String("::"), Qt::SkipEmptyParts); item.setPath(scope.split(QLatin1String("::"), Qt::SkipEmptyParts));
item.text = text; item.setLineText(text);
item.icon = info->icon(); item.setIcon(info->icon());
item.userData = QVariant::fromValue(info); item.setUserData(QVariant::fromValue(info));
resultItems << item; resultItems << item;
} }

View File

@@ -202,7 +202,7 @@ class Filter : public Core::SearchResultFilter
bool matches(const SearchResultItem &item) const override bool matches(const SearchResultItem &item) const override
{ {
switch (static_cast<CPlusPlus::Usage::Type>(item.userData.toInt())) { switch (static_cast<CPlusPlus::Usage::Type>(item.userData().toInt())) {
case CPlusPlus::Usage::Type::Read: case CPlusPlus::Usage::Type::Read:
return m_showReads; return m_showReads;
case CPlusPlus::Usage::Type::Write: case CPlusPlus::Usage::Type::Write:
@@ -630,9 +630,13 @@ static void displayResults(SearchResult *search, QFutureWatcher<CPlusPlus::Usage
}; };
for (int index = first; index != last; ++index) { for (int index = first; index != last; ++index) {
const CPlusPlus::Usage result = watcher->future().resultAt(index); const CPlusPlus::Usage result = watcher->future().resultAt(index);
search->addResult(result.path.toString(), result.line, result.lineText, SearchResultItem item;
result.col, result.len, int(result.type), item.setFilePath(result.path);
colorStyleForUsageType(result.type)); item.setMainRange(result.line, result.col, result.len);
item.setLineText(result.lineText);
item.setUserData(int(result.type));
item.setStyle(colorStyleForUsageType(result.type));
search->addResult(item);
if (parameters.prettySymbolName.isEmpty()) if (parameters.prettySymbolName.isEmpty())
continue; continue;
@@ -823,8 +827,11 @@ void CppFindReferences::findMacroUses(const CPlusPlus::Macro &macro, const QStri
unsigned column; unsigned column;
const QString line = FindMacroUsesInFile::matchingLine(macro.bytesOffset(), source, const QString line = FindMacroUsesInFile::matchingLine(macro.bytesOffset(), source,
&column); &column);
search->addResult(macro.fileName(), macro.line(), line, column, SearchResultItem item;
macro.nameToQString().length()); item.setFilePath(Utils::FilePath::fromString(macro.fileName()));
item.setLineText(line);
item.setMainRange(macro.line(), column, macro.nameToQString().length());
search->addResult(item);
} }
QFuture<CPlusPlus::Usage> result; QFuture<CPlusPlus::Usage> result;

View File

@@ -64,7 +64,7 @@ public:
{ {
ResultDataList result; ResultDataList result;
for (const Core::SearchResultItem &entry : entries) for (const Core::SearchResultItem &entry : entries)
result << ResultData(entry.text, entry.path.join(QLatin1String("::"))); result << ResultData(entry.lineText(), entry.path().join(QLatin1String("::")));
return result; return result;
} }

View File

@@ -176,9 +176,9 @@ void SymbolsFindFilter::finish()
void SymbolsFindFilter::openEditor(const SearchResultItem &item) void SymbolsFindFilter::openEditor(const SearchResultItem &item)
{ {
if (!item.userData.canConvert<IndexItem::Ptr>()) if (!item.userData().canConvert<IndexItem::Ptr>())
return; return;
IndexItem::Ptr info = item.userData.value<IndexItem::Ptr>(); IndexItem::Ptr info = item.userData().value<IndexItem::Ptr>();
EditorManager::openEditorAt(info->fileName(), info->line(), info->column()); EditorManager::openEditorAt(info->fileName(), info->line(), info->column());
} }

View File

@@ -312,13 +312,13 @@ IEditor *GitGrep::openEditor(const SearchResultItem &item,
const TextEditor::FileFindParameters &parameters) const TextEditor::FileFindParameters &parameters)
{ {
GitGrepParameters params = parameters.searchEngineParameters.value<GitGrepParameters>(); GitGrepParameters params = parameters.searchEngineParameters.value<GitGrepParameters>();
if (params.ref.isEmpty() || item.path.isEmpty()) if (params.ref.isEmpty() || item.path().isEmpty())
return nullptr; return nullptr;
const QString path = QDir::fromNativeSeparators(item.path.first()); const QString path = QDir::fromNativeSeparators(item.path().first());
const QString topLevel = parameters.additionalParameters.toString(); const QString topLevel = parameters.additionalParameters.toString();
IEditor *editor = m_client->openShowEditor( IEditor *editor = m_client->openShowEditor(
topLevel, params.ref, path, GitClient::ShowEditor::OnlyIfDifferent); topLevel, params.ref, path, GitClient::ShowEditor::OnlyIfDifferent);
editor->gotoLine(item.mainRange.begin.line, item.mainRange.begin.column); editor->gotoLine(item.mainRange().begin.line, item.mainRange().begin.column);
return editor; return editor;
} }

View File

@@ -170,17 +170,15 @@ QList<Core::SearchResultItem> generateSearchResultItems(
const QString &fileName = it.key(); const QString &fileName = it.key();
Core::SearchResultItem item; Core::SearchResultItem item;
item.path = QStringList() << fileName; item.setFilePath(Utils::FilePath::fromString(fileName));
item.useTextEditorFont = true; item.setUseTextEditorFont(true);
QStringList lines = getFileContents(fileName); QStringList lines = getFileContents(fileName);
for (const ItemData &data : it.value()) { for (const ItemData &data : it.value()) {
item.mainRange = data.range; item.setMainRange(data.range);
if (data.range.begin.line > 0 && data.range.begin.line <= lines.size()) if (data.range.begin.line > 0 && data.range.begin.line <= lines.size())
item.text = lines[data.range.begin.line - 1]; item.setLineText(lines[data.range.begin.line - 1]);
else item.setUserData(data.userData);
item.text.clear();
item.userData = data.userData;
result << item; result << item;
} }
} }
@@ -411,8 +409,8 @@ void SymbolSupport::applyRename(const QList<Core::SearchResultItem> &checkedItem
{ {
QMap<DocumentUri, QList<TextEdit>> editsForDocuments; QMap<DocumentUri, QList<TextEdit>> editsForDocuments;
for (const Core::SearchResultItem &item : checkedItems) { for (const Core::SearchResultItem &item : checkedItems) {
auto uri = DocumentUri::fromFilePath(Utils::FilePath::fromString(item.path.value(0))); auto uri = DocumentUri::fromFilePath(Utils::FilePath::fromString(item.path().value(0)));
TextEdit edit(item.userData.toJsonObject()); TextEdit edit(item.userData().toJsonObject());
if (edit.isValid(nullptr)) if (edit.isValid(nullptr))
editsForDocuments[uri] << edit; editsForDocuments[uri] << edit;
} }

View File

@@ -1008,11 +1008,11 @@ void FindReferences::displayResults(int first, int last)
} }
for (int index = first; index != last; ++index) { for (int index = first; index != last; ++index) {
Usage result = m_watcher.future().resultAt(index); Usage result = m_watcher.future().resultAt(index);
m_currentSearch->addResult(result.path, SearchResultItem item;
result.line, item.setFilePath(Utils::FilePath::fromString(result.path));
result.lineText, item.setLineText(result.lineText);
result.col, item.setMainRange(result.line, result.col, result.len);
result.len); m_currentSearch->addResult(item);
} }
} }

View File

@@ -234,14 +234,11 @@ static void displayResult(QFutureWatcher<FileSearchResultList> *watcher,
QList<SearchResultItem> items; QList<SearchResultItem> items;
for (const FileSearchResult &result : results) { for (const FileSearchResult &result : results) {
SearchResultItem item; SearchResultItem item;
item.path = QStringList(QDir::toNativeSeparators(result.fileName)); item.setFilePath(Utils::FilePath::fromString(result.fileName));
item.mainRange.begin.line = result.lineNumber; item.setMainRange(result.lineNumber, result.matchStart, result.matchLength);
item.mainRange.begin.column = result.matchStart; item.setLineText(result.matchingLine);
item.mainRange.end = item.mainRange.begin; item.setUseTextEditorFont(true);
item.mainRange.end.column += result.matchLength; item.setUserData(result.regexpCapturedTexts);
item.text = result.matchingLine;
item.useTextEditorFont = true;
item.userData = result.regexpCapturedTexts;
items << item; items << item;
} }
search->addResults(items, SearchResult::AddOrdered); search->addResults(items, SearchResult::AddOrdered);
@@ -493,7 +490,7 @@ QStringList BaseFileFind::replaceAll(const QString &text,
QHash<QString, QList<SearchResultItem> > changes; QHash<QString, QList<SearchResultItem> > changes;
for (const SearchResultItem &item : items) for (const SearchResultItem &item : items)
changes[QDir::fromNativeSeparators(item.path.first())].append(item); changes[QDir::fromNativeSeparators(item.path().first())].append(item);
// Checking for files without write permissions // Checking for files without write permissions
QSet<FilePath> roFiles; QSet<FilePath> roFiles;
@@ -519,28 +516,28 @@ QStringList BaseFileFind::replaceAll(const QString &text,
RefactoringFilePtr file = refactoring.file(fileName); RefactoringFilePtr file = refactoring.file(fileName);
QSet<QPair<int, int> > processed; QSet<QPair<int, int> > processed;
for (const SearchResultItem &item : changeItems) { for (const SearchResultItem &item : changeItems) {
const QPair<int, int> &p = qMakePair(item.mainRange.begin.line, const QPair<int, int> &p = qMakePair(item.mainRange().begin.line,
item.mainRange.begin.column); item.mainRange().begin.column);
if (processed.contains(p)) if (processed.contains(p))
continue; continue;
processed.insert(p); processed.insert(p);
QString replacement; QString replacement;
if (item.userData.canConvert<QStringList>() && !item.userData.toStringList().isEmpty()) { if (item.userData().canConvert<QStringList>() && !item.userData().toStringList().isEmpty()) {
replacement = Utils::expandRegExpReplacement(text, item.userData.toStringList()); replacement = Utils::expandRegExpReplacement(text, item.userData().toStringList());
} else if (preserveCase) { } else if (preserveCase) {
const QString originalText = (item.mainRange.length(item.text) == 0) const QString originalText = (item.mainRange().length(item.lineText()) == 0)
? item.text ? item.lineText()
: item.mainRange.mid(item.text); : item.mainRange().mid(item.lineText());
replacement = Utils::matchCaseReplacement(originalText, text); replacement = Utils::matchCaseReplacement(originalText, text);
} else { } else {
replacement = text; replacement = text;
} }
const int start = file->position(item.mainRange.begin.line, const int start = file->position(item.mainRange().begin.line,
item.mainRange.begin.column + 1); item.mainRange().begin.column + 1);
const int end = file->position(item.mainRange.end.line, const int end = file->position(item.mainRange().end.line,
item.mainRange.end.column + 1); item.mainRange().end.column + 1);
changeSet.replace(start, end, replacement); changeSet.replace(start, end, replacement);
} }
file->setChangeSet(changeSet); file->setChangeSet(changeSet);