/************************************************************************** ** ** This file is part of Qt Creator ** ** Copyright (c) 2011 Nokia Corporation and/or its subsidiary(-ies). ** ** Contact: Nokia Corporation (qt-info@nokia.com) ** ** ** GNU Lesser General Public License Usage ** ** 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. ** ** In addition, as a special exception, Nokia gives you certain additional ** rights. These rights are described in the Nokia Qt LGPL Exception ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ** ** Other Usage ** ** Alternatively, this file may be used in accordance with the terms and ** conditions contained in a signed written agreement between you and Nokia. ** ** If you have questions regarding the use of this file, please contact ** Nokia at qt-info@nokia.com. ** **************************************************************************/ #include "qmljsfunctionfilter.h" #include "qmljslocatordata.h" #include #include #include using namespace QmlJSTools::Internal; Q_DECLARE_METATYPE(LocatorData::Entry) FunctionFilter::FunctionFilter(LocatorData *data, QObject *parent) : Locator::ILocatorFilter(parent) , m_data(data) { setShortcutString(QString(QLatin1Char('m'))); setIncludedByDefault(false); } FunctionFilter::~FunctionFilter() { } void FunctionFilter::refresh(QFutureInterface &) { } static bool compareLexigraphically(const Locator::FilterEntry &a, const Locator::FilterEntry &b) { return a.displayName < b.displayName; } QList FunctionFilter::matchesFor(QFutureInterface &future, const QString &origEntry) { QString entry = trimWildcards(origEntry); QList goodEntries; QList 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('?')); QHashIterator > it(m_data->entries()); while (it.hasNext()) { if (future.isCanceled()) break; it.next(); const QList items = it.value(); foreach (const LocatorData::Entry &info, items) { if (info.type != LocatorData::Function) continue; if ((hasWildcard && regexp.exactMatch(info.symbolName)) || (!hasWildcard && matcher.indexIn(info.symbolName) != -1)) { QVariant id = qVariantFromValue(info); Locator::FilterEntry filterEntry(this, info.displayName, id/*, info.icon*/); filterEntry.extraInfo = info.extraInfo; 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 FunctionFilter::accept(Locator::FilterEntry selection) const { const LocatorData::Entry entry = qvariant_cast(selection.internalData); TextEditor::BaseTextEditorWidget::openEditorAt(entry.fileName, entry.line, entry.column, QString(), Core::EditorManager::ModeSwitch); }