Skip to content
Snippets Groups Projects
Commit 575495b9 authored by Christian Hoenig's avatar Christian Hoenig
Browse files

Implement CppCurrentDocumentFilter for symbols in current document

parent 57bb98b6
No related branches found
No related tags found
No related merge requests found
/**************************************************************************
**
** This file is part of Qt Creator
**
** Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
**
** Contact: Qt Software Information (qt-info@nokia.com)
**
** Commercial Usage
**
** Licensees holding valid Qt Commercial licenses may use this file in
** accordance with the Qt Commercial License Agreement provided with the
** Software or, alternatively, in accordance with the terms contained in
** a written agreement between you and Nokia.
**
** GNU Lesser General Public License Usage
**
** Alternatively, this file may be used under the terms of the GNU Lesser
** General Public License version 2.1 as published by the Free Software
** Foundation and appearing in the file LICENSE.LGPL included in the
** packaging of this file. Please review the following information to
** ensure the GNU Lesser General Public License version 2.1 requirements
** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
**
** If you are unsure which license is appropriate for your use, please
** contact the sales department at qt-sales@nokia.com.
**
**************************************************************************/
#include "cppcurrentdocumentfilter.h"
#include "cppmodelmanager.h"
#include <coreplugin/editormanager/editormanager.h>
#include <cplusplus/CppDocument.h>
using namespace CppTools::Internal;
using namespace CPlusPlus;
CppCurrentDocumentFilter::CppCurrentDocumentFilter(CppModelManager *manager, Core::EditorManager *editorManager)
: m_modelManager(manager)
{
setShortcutString(".");
setIncludedByDefault(false);
search.setSymbolsToSearchFor(SearchSymbols::Declarations |
SearchSymbols::Enums |
SearchSymbols::Functions |
SearchSymbols::Classes);
search.setSeparateScope(true);
connect(manager, SIGNAL(documentUpdated(CPlusPlus::Document::Ptr)),
this, SLOT(onDocumentUpdated(CPlusPlus::Document::Ptr)));
connect(editorManager, SIGNAL(currentEditorChanged(Core::IEditor*)),
this, SLOT(onCurrentEditorChanged(Core::IEditor*)));
connect(editorManager, SIGNAL(editorAboutToClose(Core::IEditor*)),
this, SLOT(onEditorAboutToClose(Core::IEditor*)));
}
QList<QuickOpen::FilterEntry> CppCurrentDocumentFilter::matchesFor(const QString & origEntry)
{
QString entry = trimWildcards(origEntry);
QList<QuickOpen::FilterEntry> goodEntries;
QList<QuickOpen::FilterEntry> betterEntries;
QStringMatcher matcher(entry, Qt::CaseInsensitive);
const QRegExp regexp("*"+entry+"*", Qt::CaseInsensitive, QRegExp::Wildcard);
if (!regexp.isValid())
return goodEntries;
bool hasWildcard = (entry.contains('*') || entry.contains('?'));
if (m_currentFileName.isEmpty())
return goodEntries;
if (m_itemsOfCurrentDoc.isEmpty()) {
Snapshot snapshot = m_modelManager->snapshot();
Document::Ptr thisDocument = snapshot.value(m_currentFileName);
if (thisDocument)
m_itemsOfCurrentDoc = search(thisDocument);
}
foreach (const ModelItemInfo & info, m_itemsOfCurrentDoc)
{
if ((hasWildcard && regexp.exactMatch(info.symbolName))
|| (!hasWildcard && matcher.indexIn(info.symbolName) != -1))
{
QString symbolName = info.symbolName;// + (info.type == ModelItemInfo::Declaration ? ";" : " {...}");
QVariant id = qVariantFromValue(info);
QuickOpen::FilterEntry filterEntry(this, symbolName, id, info.icon);
filterEntry.extraInfo = info.symbolType;
if (info.symbolName.startsWith(entry))
betterEntries.append(filterEntry);
else
goodEntries.append(filterEntry);
}
}
// entries are unsorted by design!
betterEntries += goodEntries;
return betterEntries;
}
void CppCurrentDocumentFilter::accept(QuickOpen::FilterEntry selection) const
{
ModelItemInfo info = qvariant_cast<CppTools::Internal::ModelItemInfo>(selection.internalData);
TextEditor::BaseTextEditor::openEditorAt(info.fileName, info.line);
}
void CppCurrentDocumentFilter::refresh(QFutureInterface<void> &future)
{
Q_UNUSED(future);
}
void CppCurrentDocumentFilter::onDocumentUpdated(Document::Ptr doc)
{
if (m_currentFileName == doc->fileName()) {
m_itemsOfCurrentDoc.clear();
}
}
void CppCurrentDocumentFilter::onCurrentEditorChanged(Core::IEditor * currentEditor)
{
if (currentEditor) {
m_currentFileName = currentEditor->file()->fileName();
} else {
m_currentFileName.clear();
}
m_itemsOfCurrentDoc.clear();
}
void CppCurrentDocumentFilter::onEditorAboutToClose(Core::IEditor * editorAboutToClose)
{
if (!editorAboutToClose) return;
if (m_currentFileName == editorAboutToClose->file()->fileName()) {
m_currentFileName.clear();
m_itemsOfCurrentDoc.clear();
}
}
/**************************************************************************
**
** This file is part of Qt Creator
**
** Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
**
** Contact: Qt Software Information (qt-info@nokia.com)
**
** Commercial Usage
**
** Licensees holding valid Qt Commercial licenses may use this file in
** accordance with the Qt Commercial License Agreement provided with the
** Software or, alternatively, in accordance with the terms contained in
** a written agreement between you and Nokia.
**
** GNU Lesser General Public License Usage
**
** Alternatively, this file may be used under the terms of the GNU Lesser
** General Public License version 2.1 as published by the Free Software
** Foundation and appearing in the file LICENSE.LGPL included in the
** packaging of this file. Please review the following information to
** ensure the GNU Lesser General Public License version 2.1 requirements
** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
**
** If you are unsure which license is appropriate for your use, please
** contact the sales department at qt-sales@nokia.com.
**
**************************************************************************/
#ifndef CPPCURRENTDOCUMENTFILTER_H
#define CPPCURRENTDOCUMENTFILTER_H
#include "searchsymbols.h"
#include <quickopen/iquickopenfilter.h>
namespace Core {
class EditorManager;
class IEditor;
}
namespace CppTools {
namespace Internal {
class CppModelManager;
class CppCurrentDocumentFilter : public QuickOpen::IQuickOpenFilter
{
Q_OBJECT
public:
CppCurrentDocumentFilter(CppModelManager *manager, Core::EditorManager *editorManager);
~CppCurrentDocumentFilter() {}
QString trName() const { return tr("Methods in current Document"); }
QString name() const { return QLatin1String("Methods in current Document"); }
Priority priority() const { return Medium; }
QList<QuickOpen::FilterEntry> matchesFor(const QString &entry);
void accept(QuickOpen::FilterEntry selection) const;
void refresh(QFutureInterface<void> &future);
private slots:
void onDocumentUpdated(CPlusPlus::Document::Ptr doc);
void onCurrentEditorChanged(Core::IEditor * currentEditor);
void onEditorAboutToClose(Core::IEditor * currentEditor);
private:
CppModelManager * m_modelManager;
QString m_currentFileName;
QList<ModelItemInfo> m_itemsOfCurrentDoc;
SearchSymbols search;
};
} // namespace Internal
} // namespace CppTools
#endif // CPPCURRENTDOCUMENTFILTER_H
......@@ -11,6 +11,7 @@ DEFINES += CPPTOOLS_LIBRARY
HEADERS += completionsettingspage.h \
cppclassesfilter.h \
cppcodecompletion.h \
cppcurrentdocumentfilter.h \
cppfunctionsfilter.h \
cppmodelmanager.h \
cppmodelmanagerinterface.h \
......@@ -26,6 +27,7 @@ HEADERS += completionsettingspage.h \
SOURCES += completionsettingspage.cpp \
cppclassesfilter.cpp \
cppcodecompletion.cpp \
cppcurrentdocumentfilter.cpp \
cppfunctionsfilter.cpp \
cppmodelmanager.cpp \
cppquickopenfilter.cpp \
......
......@@ -34,6 +34,7 @@
#include "cppclassesfilter.h"
#include "cppcodecompletion.h"
#include "cppfunctionsfilter.h"
#include "cppcurrentdocumentfilter.h"
#include "cppmodelmanager.h"
#include "cpptoolsconstants.h"
#include "cppquickopenfilter.h"
......@@ -92,6 +93,7 @@ bool CppToolsPlugin::initialize(const QStringList &arguments, QString *error)
addAutoReleasedObject(quickOpenFilter);
addAutoReleasedObject(new CppClassesFilter(m_modelManager, core->editorManager()));
addAutoReleasedObject(new CppFunctionsFilter(m_modelManager, core->editorManager()));
addAutoReleasedObject(new CppCurrentDocumentFilter(m_modelManager, core->editorManager()));
addAutoReleasedObject(new CompletionSettingsPage(m_completion));
addAutoReleasedObject(new CppFileSettingsPage(m_fileSettings));
......
......@@ -128,17 +128,20 @@ bool SearchSymbols::visit(Namespace *symbol)
return false;
}
#if 0
bool SearchSymbols::visit(Declaration *symbol)
{
if (symbol->type()->isFunction()) {
QString name = scopedSymbolName(symbol);
QString type = overview.prettyType(symbol->type());
appendItems(name, type, ModelItemInfo::Method, symbol->fileName());
}
if (!(symbolsToSearchFor & Declarations))
return false;
QString name = symbolName(symbol);
QString scopedName = scopedSymbolName(name);
QString type = overview.prettyType(symbol->type(),
separateScope ? symbol->identity() : 0);
appendItem(separateScope ? type : scopedName,
separateScope ? _scope : type,
ModelItemInfo::Declaration, symbol);
return false;
}
#endif
bool SearchSymbols::visit(Class *symbol)
{
......
......@@ -48,7 +48,7 @@ namespace Internal {
struct ModelItemInfo
{
enum ItemType { Enum, Class, Method };
enum ItemType { Enum, Class, Method, Declaration };
ModelItemInfo()
{ }
......@@ -80,9 +80,10 @@ class SearchSymbols: public std::unary_function<CPlusPlus::Document::Ptr, QList<
{
public:
enum SymbolType {
Classes = 0x1,
Functions = 0x2,
Enums = 0x4
Classes = 0x1,
Functions = 0x2,
Enums = 0x4,
Declarations = 0x8
};
Q_DECLARE_FLAGS(SymbolTypes, SymbolType)
......@@ -106,10 +107,7 @@ protected:
virtual bool visit(CPlusPlus::Enum *symbol);
virtual bool visit(CPlusPlus::Function *symbol);
virtual bool visit(CPlusPlus::Namespace *symbol);
#if 0
// This visit method would make function declaration be included in QuickOpen
virtual bool visit(CPlusPlus::Declaration *symbol);
#endif
virtual bool visit(CPlusPlus::Class *symbol);
QString scopedSymbolName(const QString &symbolName) const;
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment