Files
qt-creator/src/plugins/texteditor/findinfiles.cpp

181 lines
6.1 KiB
C++
Raw Normal View History

/****************************************************************************
2008-12-02 12:01:29 +01:00
**
** Copyright (C) 2016 The Qt Company Ltd.
** Contact: https://www.qt.io/licensing/
2008-12-02 12:01:29 +01:00
**
** This file is part of Qt Creator.
2008-12-02 12:01:29 +01:00
**
** Commercial License Usage
** Licensees holding valid commercial Qt licenses may use this file in
** accordance with the commercial license agreement provided with the
** Software or, alternatively, in accordance with the terms contained in
** a written agreement between you and The Qt Company. For licensing terms
** and conditions see https://www.qt.io/terms-conditions. For further
** information use the contact form at https://www.qt.io/contact-us.
**
** GNU General Public License Usage
** Alternatively, this file may be used under the terms of the GNU
** General Public License version 3 as published by the Free Software
** Foundation with exceptions as appearing in the file LICENSE.GPL3-EXCEPT
** included in the packaging of this file. Please review the following
** information to ensure the GNU General Public License requirements will
** be met: https://www.gnu.org/licenses/gpl-3.0.html.
2010-12-17 16:01:08 +01:00
**
****************************************************************************/
2008-12-02 16:19:05 +01:00
2008-12-02 12:01:29 +01:00
#include "findinfiles.h"
#include <coreplugin/editormanager/editormanager.h>
#include <coreplugin/find/findplugin.h>
#include <coreplugin/icore.h>
#include <utils/filesearch.h>
#include <utils/fileutils.h>
#include <utils/historycompleter.h>
#include <utils/pathchooser.h>
#include <utils/qtcassert.h>
#include <QDebug>
#include <QSettings>
#include <QDir>
#include <QPushButton>
#include <QFileDialog>
#include <QLabel>
#include <QHBoxLayout>
2008-12-02 12:01:29 +01:00
using namespace Core;
using namespace TextEditor;
using namespace Utils;
2008-12-02 12:01:29 +01:00
static FindInFiles *m_instance = 0;
static const char HistoryKey[] = "FindInFiles.Directories.History";
FindInFiles::FindInFiles()
: m_configWidget(0),
2008-12-02 12:01:29 +01:00
m_directory(0)
{
m_instance = this;
connect(EditorManager::instance(), &EditorManager::findOnFileSystemRequest,
this, &FindInFiles::findOnFileSystem);
2008-12-02 12:01:29 +01:00
}
FindInFiles::~FindInFiles()
{
}
bool FindInFiles::isValid() const
{
return m_directory->isValid();
}
QString FindInFiles::id() const
{
return QLatin1String("Files on Disk");
}
QString FindInFiles::displayName() const
2008-12-02 12:01:29 +01:00
{
return tr("Files in File System");
2008-12-02 12:01:29 +01:00
}
FileIterator *FindInFiles::files(const QStringList &nameFilters,
const QVariant &additionalParameters) const
2008-12-02 12:01:29 +01:00
{
return new SubDirFileIterator(QStringList() << additionalParameters.toString(),
nameFilters,
EditorManager::defaultTextCodec());
2008-12-02 12:01:29 +01:00
}
QVariant FindInFiles::additionalParameters() const
{
return qVariantFromValue(path().toString());
}
QString FindInFiles::label() const
{
const QChar slash = QLatin1Char('/');
const QStringList &nonEmptyComponents = path().toFileInfo().absoluteFilePath()
.split(slash, QString::SkipEmptyParts);
return tr("Directory \"%1\":").arg(nonEmptyComponents.isEmpty() ? QString(slash) : nonEmptyComponents.last());
}
QString FindInFiles::toolTip() const
{
//: %3 is filled by BaseFileFind::runNewSearch
return tr("Path: %1\nFilter: %2\n%3")
.arg(path().toUserOutput())
.arg(fileNameFilters().join(QLatin1Char(',')));
}
2008-12-02 12:01:29 +01:00
QWidget *FindInFiles::createConfigWidget()
{
if (!m_configWidget) {
m_configWidget = new QWidget;
QGridLayout * const gridLayout = new QGridLayout(m_configWidget);
gridLayout->setMargin(0);
m_configWidget->setLayout(gridLayout);
QLabel *dirLabel = new QLabel(tr("Director&y:"));
gridLayout->addWidget(dirLabel, 0, 0, Qt::AlignRight);
m_directory = new PathChooser;
m_directory->setExpectedKind(PathChooser::ExistingDirectory);
m_directory->setHistoryCompleter(QLatin1String(HistoryKey),
/*restoreLastItemFromHistory=*/ true);
m_directory->setPromptDialogTitle(tr("Directory to Search"));
connect(m_directory.data(), &PathChooser::validChanged,
this, &FindInFiles::enabledChanged);
if (!HistoryCompleter::historyExistsFor(QLatin1String(HistoryKey))) {
auto completer = static_cast<HistoryCompleter *>(m_directory->lineEdit()->completer());
const QStringList legacyHistory = Core::ICore::settings()->value(
QLatin1String("Find/FindInFiles/directories")).toStringList();
for (const QString &dir: legacyHistory)
completer->addEntry(dir);
}
dirLabel->setBuddy(m_directory);
gridLayout->addWidget(m_directory, 0, 1, 1, 2);
2008-12-02 12:01:29 +01:00
QLabel * const filePatternLabel = new QLabel(tr("Fi&le pattern:"));
2008-12-02 12:01:29 +01:00
filePatternLabel->setMinimumWidth(80);
filePatternLabel->setSizePolicy(QSizePolicy::Fixed, QSizePolicy::Preferred);
filePatternLabel->setAlignment(Qt::AlignRight | Qt::AlignVCenter);
QWidget *patternWidget = createPatternWidget();
filePatternLabel->setBuddy(patternWidget);
gridLayout->addWidget(filePatternLabel, 1, 0);
gridLayout->addWidget(patternWidget, 1, 1, 1, 2);
2008-12-02 12:01:29 +01:00
m_configWidget->setSizePolicy(QSizePolicy::Preferred, QSizePolicy::Preferred);
}
return m_configWidget;
}
FileName FindInFiles::path() const
{
return m_directory->fileName();
}
2008-12-02 12:01:29 +01:00
void FindInFiles::writeSettings(QSettings *settings)
{
settings->beginGroup(QLatin1String("FindInFiles"));
2008-12-02 12:01:29 +01:00
writeCommonSettings(settings);
settings->endGroup();
}
void FindInFiles::readSettings(QSettings *settings)
{
settings->beginGroup(QLatin1String("FindInFiles"));
readCommonSettings(settings, QLatin1String("*.cpp,*.h"));
2008-12-02 12:01:29 +01:00
settings->endGroup();
}
void FindInFiles::setDirectory(const FileName &directory)
{
m_directory->setFileName(directory);
}
void FindInFiles::findOnFileSystem(const QString &path)
{
QTC_ASSERT(m_instance, return);
const QFileInfo fi(path);
const QString folder = fi.isDir() ? fi.absoluteFilePath() : fi.absolutePath();
m_instance->setDirectory(FileName::fromString(folder));
FindPlugin::instance()->openFindDialog(m_instance);
}