forked from qt-creator/qt-creator
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:
@@ -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);
|
||||||
|
@@ -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
|
||||||
|
@@ -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)
|
||||||
|
@@ -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) {
|
||||||
|
@@ -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);
|
||||||
|
@@ -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;
|
||||||
|
@@ -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());
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/*!
|
/*!
|
||||||
|
@@ -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);
|
||||||
|
@@ -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);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@@ -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;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@@ -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 ¯o, 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;
|
||||||
|
@@ -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;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@@ -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());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@@ -312,13 +312,13 @@ IEditor *GitGrep::openEditor(const SearchResultItem &item,
|
|||||||
const TextEditor::FileFindParameters ¶meters)
|
const TextEditor::FileFindParameters ¶meters)
|
||||||
{
|
{
|
||||||
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;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@@ -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;
|
||||||
}
|
}
|
||||||
|
@@ -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);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@@ -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);
|
||||||
|
Reference in New Issue
Block a user