From 4cac96447d05489bc9477799249c2fb83b590329 Mon Sep 17 00:00:00 2001 From: Francois Ferrand Date: Fri, 1 Jun 2012 17:13:53 +0200 Subject: [PATCH] Allow specifying line number when selecting a file with the locator. When using the file selections locators (OpenDocumentsFilter, FileSystemFilter, and those inherited from BaseFileFilter), allow specifying the line where to open the file: like 'file.cpp:654'. This syntax works for wildcards/incomplete expression as well: toto:423 will match 'toto', and open resulting file at line 423. Also, fix line extraction in editormanager, to support a single semicolon (without number) as well as a line explicitely set to 0. Change-Id: I80e13b59aa9c972f33963cfee81ec04f277fe526 Reviewed-by: Friedemann Kleint Reviewed-by: Eike Ziller --- .../editormanager/editormanager.cpp | 30 +++++++++++++++++-- .../coreplugin/editormanager/editormanager.h | 1 + src/plugins/locator/basefilefilter.cpp | 6 ++-- src/plugins/locator/filesystemfilter.cpp | 17 +++++++---- src/plugins/locator/locatorwidget.cpp | 6 ++-- src/plugins/locator/opendocumentsfilter.cpp | 9 ++++-- 6 files changed, 55 insertions(+), 14 deletions(-) diff --git a/src/plugins/coreplugin/editormanager/editormanager.cpp b/src/plugins/coreplugin/editormanager/editormanager.cpp index 3a73707f641..b1364915ef2 100644 --- a/src/plugins/coreplugin/editormanager/editormanager.cpp +++ b/src/plugins/coreplugin/editormanager/editormanager.cpp @@ -1218,7 +1218,7 @@ IEditor *EditorManager::openEditor(const QString &fileName, const Id &editorId, return m_instance->openEditor(m_instance->currentEditorView(), fileName, editorId, flags, newEditor); } -int extractLineNumber(QString *fileName) +static int extractLineNumber(QString *fileName) { int i = fileName->length() - 1; for (; i >= 0; --i) { @@ -1229,7 +1229,10 @@ int extractLineNumber(QString *fileName) return -1; const QChar c = fileName->at(i); if (c == QLatin1Char(':') || c == QLatin1Char('+')) { - if (const int result = fileName->mid(i + 1).toInt()) { + bool ok; + const QString suffix = fileName->mid(i + 1); + const int result = suffix.toInt(&ok); + if (suffix.isEmpty() || ok) { fileName->truncate(i); return result; } @@ -1237,6 +1240,29 @@ int extractLineNumber(QString *fileName) return -1; } +// Extract line number suffix. Return the suffix (e.g. ":132") and truncates the filename accordingly. +QString EditorManager::splitLineNumber(QString *fileName) +{ + int i = fileName->length() - 1; + for (; i >= 0; --i) { + if (!fileName->at(i).isNumber()) + break; + } + if (i == -1) + return QString(); + const QChar c = fileName->at(i); + if (c == QLatin1Char(':') || c == QLatin1Char('+')) { + const QString result = fileName->mid(i + 1); + bool ok; + result.toInt(&ok); + if (result.isEmpty() || ok) { + fileName->truncate(i); + return QString(c) + result; + } + } + return QString(); +} + static QString autoSaveName(const QString &fileName) { return fileName + QLatin1String(".autosave"); diff --git a/src/plugins/coreplugin/editormanager/editormanager.h b/src/plugins/coreplugin/editormanager/editormanager.h index aa2e8699010..e9da163b119 100644 --- a/src/plugins/coreplugin/editormanager/editormanager.h +++ b/src/plugins/coreplugin/editormanager/editormanager.h @@ -117,6 +117,7 @@ public: }; Q_DECLARE_FLAGS(OpenEditorFlags, OpenEditorFlag) + static QString splitLineNumber(QString *fileName); static IEditor *openEditor(const QString &fileName, const Id &editorId = Id(), OpenEditorFlags flags = 0, bool *newEditor = 0); static IEditor *openEditorWithContents(const Id &editorId, diff --git a/src/plugins/locator/basefilefilter.cpp b/src/plugins/locator/basefilefilter.cpp index 46359f6c107..a013c3c9da9 100644 --- a/src/plugins/locator/basefilefilter.cpp +++ b/src/plugins/locator/basefilefilter.cpp @@ -51,6 +51,7 @@ QList BaseFileFilter::matchesFor(QFutureInterface matches; QList badMatches; QString needle = trimWildcards(origEntry); + const QString lineNoSuffix = EditorManager::splitLineNumber(&needle); QStringMatcher matcher(needle, Qt::CaseInsensitive); const QChar asterisk = QLatin1Char('*'); QRegExp regexp(asterisk + needle+ asterisk, Qt::CaseInsensitive, QRegExp::Wildcard); @@ -81,7 +82,7 @@ QList BaseFileFilter::matchesFor(QFutureInterface BaseFileFilter::matchesFor(QFutureInterface FileSystemFilter::matchesFor(QFutureInterface &future, const QString &entry) +QList FileSystemFilter::matchesFor(QFutureInterface &future, const QString &entry_) { QList value; + QString entry = entry_; + const QString lineNoSuffix = EditorManager::splitLineNumber(&entry); QFileInfo entryInfo(entry); QString name = entryInfo.fileName(); QString directory = entryInfo.path(); @@ -81,7 +83,8 @@ QList FileSystemFilter::matchesFor(QFutureInterface FileSystemFilter::matchesFor(QFutureInterface FileSystemFilter::matchesFor(QFutureInterfaceshow(value, value.length()); return; } EditorManager::openEditor(selection.internalData.toString(), Id(), - EditorManager::ModeSwitch); + EditorManager::ModeSwitch | EditorManager::CanContainLineNumber); } bool FileSystemFilter::openConfigDialog(QWidget *parent, bool &needsRefresh) diff --git a/src/plugins/locator/locatorwidget.cpp b/src/plugins/locator/locatorwidget.cpp index 5725a13c235..eb24477aa69 100644 --- a/src/plugins/locator/locatorwidget.cpp +++ b/src/plugins/locator/locatorwidget.cpp @@ -43,6 +43,7 @@ #include #include #include +#include #include #include #include @@ -189,8 +190,9 @@ QVariant LocatorModel::data(const QModelIndex &index, int role) const FilterEntry &entry = mEntries[index.row()]; if (entry.resolveFileIcon && entry.displayIcon.isNull()) { entry.resolveFileIcon = false; - entry.displayIcon = - Core::FileIconProvider::instance()->icon(QFileInfo(entry.internalData.toString())); + QString path = entry.internalData.toString(); + Core::EditorManager::splitLineNumber(&path); + entry.displayIcon = Core::FileIconProvider::instance()->icon(QFileInfo(path)); } return entry.displayIcon; } else if (role == Qt::ForegroundRole && index.column() == 1) { diff --git a/src/plugins/locator/opendocumentsfilter.cpp b/src/plugins/locator/opendocumentsfilter.cpp index d8196c798f3..06f84ea8286 100644 --- a/src/plugins/locator/opendocumentsfilter.cpp +++ b/src/plugins/locator/opendocumentsfilter.cpp @@ -53,9 +53,11 @@ OpenDocumentsFilter::OpenDocumentsFilter(EditorManager *editorManager) : setIncludedByDefault(true); } -QList OpenDocumentsFilter::matchesFor(QFutureInterface &future, const QString &entry) +QList OpenDocumentsFilter::matchesFor(QFutureInterface &future, const QString &entry_) { QList value; + QString entry = entry_; + const QString lineNoSuffix = EditorManager::splitLineNumber(&entry); const QChar asterisk = QLatin1Char('*'); QString pattern = QString(asterisk); pattern += entry; @@ -71,7 +73,7 @@ QList OpenDocumentsFilter::matchesFor(QFutureInterface &future) void OpenDocumentsFilter::accept(FilterEntry selection) const { - EditorManager::openEditor(selection.internalData.toString(), Id(), EditorManager::ModeSwitch); + EditorManager::openEditor(selection.internalData.toString(), Id(), + EditorManager::ModeSwitch | EditorManager::CanContainLineNumber); }