/************************************************************************** ** ** This file is part of Qt Creator ** ** Copyright (c) 2010 Nokia Corporation and/or its subsidiary(-ies). ** ** Contact: Nokia Corporation (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 http://qt.nokia.com/contact. ** **************************************************************************/ #include "cpplocatorfilter.h" #include "cppmodelmanager.h" #include <texteditor/itexteditor.h> #include <texteditor/basetexteditor.h> #include <QtCore/QStringMatcher> using namespace CppTools::Internal; CppLocatorFilter::CppLocatorFilter(CppModelManager *manager) : m_manager(manager), m_forceNewSearchList(true) { setShortcutString(QString(QLatin1Char(':'))); setIncludedByDefault(false); connect(manager, SIGNAL(documentUpdated(CPlusPlus::Document::Ptr)), this, SLOT(onDocumentUpdated(CPlusPlus::Document::Ptr))); connect(manager, SIGNAL(aboutToRemoveFiles(QStringList)), this, SLOT(onAboutToRemoveFiles(QStringList))); } CppLocatorFilter::~CppLocatorFilter() { } void CppLocatorFilter::onDocumentUpdated(CPlusPlus::Document::Ptr doc) { m_searchList[doc->fileName()] = Info(doc); } void CppLocatorFilter::onAboutToRemoveFiles(const QStringList &files) { foreach (const QString &file, files) m_searchList.remove(file); } void CppLocatorFilter::refresh(QFutureInterface<void> &future) { Q_UNUSED(future) } static bool compareLexigraphically(const Locator::FilterEntry &a, const Locator::FilterEntry &b) { return a.displayName < b.displayName; } QList<Locator::FilterEntry> CppLocatorFilter::matchesFor(const QString &origEntry) { QString entry = trimWildcards(origEntry); QList<Locator::FilterEntry> goodEntries; QList<Locator::FilterEntry> betterEntries; const QChar asterisk = QLatin1Char('*'); QStringMatcher matcher(entry, Qt::CaseInsensitive); const QRegExp regexp(asterisk + entry+ asterisk, Qt::CaseInsensitive, QRegExp::Wildcard); if (!regexp.isValid()) return goodEntries; bool hasWildcard = (entry.contains(asterisk) || entry.contains('?')); QMutableMapIterator<QString, Info> it(m_searchList); while (it.hasNext()) { it.next(); Info info = it.value(); if (info.dirty) { info.dirty = false; info.items = search(info.doc); it.setValue(info); } QList<ModelItemInfo> items = info.items; foreach (ModelItemInfo info, items) { if ((hasWildcard && regexp.exactMatch(info.symbolName)) || (!hasWildcard && matcher.indexIn(info.symbolName) != -1)) { QVariant id = qVariantFromValue(info); Locator::FilterEntry filterEntry(this, info.symbolName, id, info.icon); if (! info.symbolType.isEmpty()) filterEntry.extraInfo = info.symbolType; else filterEntry.extraInfo = info.fileName; if (info.symbolName.startsWith(entry)) betterEntries.append(filterEntry); else goodEntries.append(filterEntry); } } } if (goodEntries.size() < 1000) qSort(goodEntries.begin(), goodEntries.end(), compareLexigraphically); if (betterEntries.size() < 1000) qSort(betterEntries.begin(), betterEntries.end(), compareLexigraphically); betterEntries += goodEntries; return betterEntries; } void CppLocatorFilter::accept(Locator::FilterEntry selection) const { ModelItemInfo info = qvariant_cast<CppTools::Internal::ModelItemInfo>(selection.internalData); TextEditor::BaseTextEditor::openEditorAt(info.fileName, info.line, info.column); }