summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/plugins/cpptools/cppcurrentdocumentfilter.cpp138
-rw-r--r--src/plugins/cpptools/cppcurrentdocumentfilter.h75
-rw-r--r--src/plugins/cpptools/cpptools.pro2
-rw-r--r--src/plugins/cpptools/cpptoolsplugin.cpp2
-rw-r--r--src/plugins/cpptools/searchsymbols.cpp17
-rw-r--r--src/plugins/cpptools/searchsymbols.h12
6 files changed, 232 insertions, 14 deletions
diff --git a/src/plugins/cpptools/cppcurrentdocumentfilter.cpp b/src/plugins/cpptools/cppcurrentdocumentfilter.cpp
new file mode 100644
index 0000000000..8d54c86ed3
--- /dev/null
+++ b/src/plugins/cpptools/cppcurrentdocumentfilter.cpp
@@ -0,0 +1,138 @@
+/**************************************************************************
+**
+** 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();
+ }
+}
diff --git a/src/plugins/cpptools/cppcurrentdocumentfilter.h b/src/plugins/cpptools/cppcurrentdocumentfilter.h
new file mode 100644
index 0000000000..70820acac3
--- /dev/null
+++ b/src/plugins/cpptools/cppcurrentdocumentfilter.h
@@ -0,0 +1,75 @@
+/**************************************************************************
+**
+** 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
diff --git a/src/plugins/cpptools/cpptools.pro b/src/plugins/cpptools/cpptools.pro
index 955145ca61..44244feb63 100644
--- a/src/plugins/cpptools/cpptools.pro
+++ b/src/plugins/cpptools/cpptools.pro
@@ -11,6 +11,7 @@ DEFINES += CPPTOOLS_LIBRARY
HEADERS += completionsettingspage.h \
cppclassesfilter.h \
cppcodecompletion.h \
+ cppcurrentdocumentfilter.h \
cppfunctionsfilter.h \
cppmodelmanager.h \
cppmodelmanagerinterface.h \
@@ -27,6 +28,7 @@ HEADERS += completionsettingspage.h \
SOURCES += completionsettingspage.cpp \
cppclassesfilter.cpp \
cppcodecompletion.cpp \
+ cppcurrentdocumentfilter.cpp \
cppfunctionsfilter.cpp \
cppmodelmanager.cpp \
cppquickopenfilter.cpp \
diff --git a/src/plugins/cpptools/cpptoolsplugin.cpp b/src/plugins/cpptools/cpptoolsplugin.cpp
index 3554805ac0..470aeea146 100644
--- a/src/plugins/cpptools/cpptoolsplugin.cpp
+++ b/src/plugins/cpptools/cpptoolsplugin.cpp
@@ -33,6 +33,7 @@
#include "cppclassesfilter.h"
#include "cppcodecompletion.h"
#include "cppfunctionsfilter.h"
+#include "cppcurrentdocumentfilter.h"
#include "cppmodelmanager.h"
#include "cpptoolsconstants.h"
#include "cppquickopenfilter.h"
@@ -157,6 +158,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));
diff --git a/src/plugins/cpptools/searchsymbols.cpp b/src/plugins/cpptools/searchsymbols.cpp
index d0b3234131..58c4712522 100644
--- a/src/plugins/cpptools/searchsymbols.cpp
+++ b/src/plugins/cpptools/searchsymbols.cpp
@@ -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)
{
diff --git a/src/plugins/cpptools/searchsymbols.h b/src/plugins/cpptools/searchsymbols.h
index c57dee6620..a103e550ce 100644
--- a/src/plugins/cpptools/searchsymbols.h
+++ b/src/plugins/cpptools/searchsymbols.h
@@ -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;