Skip to content
Snippets Groups Projects
Commit d690a844 authored by Roberto Raggi's avatar Roberto Raggi
Browse files

Imrpvoed the importer.

parent 78210a5c
No related branches found
No related tags found
No related merge requests found
......@@ -130,6 +130,9 @@ void GenericProject::parseProject()
_files = convertToAbsoluteFiles(projectInfo.value(QLatin1String("files")).toStringList());
_generated = convertToAbsoluteFiles(projectInfo.value(QLatin1String("generated")).toStringList());
_defines = projectInfo.value(QLatin1String("defines")).toStringList();
_projectIncludePaths = projectInfo.value(QLatin1String("includePaths")).toStringList();
qDebug() << "project include paths:" << _projectIncludePaths;
}
void GenericProject::refresh()
......@@ -158,7 +161,7 @@ void GenericProject::refresh()
allIncludePaths.append(headerPath.path());
}
allIncludePaths += includePaths();
allIncludePaths += this->allIncludePaths();
pinfo.frameworkPaths = allFrameworkPaths;
pinfo.includePaths = allIncludePaths;
......@@ -184,6 +187,18 @@ QStringList GenericProject::convertToAbsoluteFiles(const QStringList &paths) con
return absolutePaths;
}
QStringList GenericProject::allIncludePaths() const
{
QStringList paths;
paths += _includePaths;
paths += _projectIncludePaths;
paths.removeDuplicates();
return paths;
}
QStringList GenericProject::projectIncludePaths() const
{ return _projectIncludePaths; }
QStringList GenericProject::files() const
{ return _files; }
......@@ -398,7 +413,11 @@ void GenericProject::restoreSettingsImpl(ProjectExplorer::PersistentSettingsRead
toolChainId = QLatin1String("gcc");
setToolChainId(toolChainId.toLower()); // ### move
setIncludePaths(reader.restoreValue(QLatin1String("includePaths")).toStringList());
const QStringList userIncludePaths =
reader.restoreValue(QLatin1String("includePaths")).toStringList();
setIncludePaths(allIncludePaths());
parseProject();
refresh();
......@@ -440,7 +459,8 @@ GenericBuildSettingsWidget::GenericBuildSettingsWidget(GenericProject *project)
// include paths
QListView *includePathsView = new QListView;
_includePathsModel = new ListModel(this);
_includePathsModel->setStringList(_project->includePaths());
_includePathsModel->setStringList(_project->allIncludePaths());
includePathsView->setModel(_includePathsModel);
fl->addRow(tr("Include paths:"), includePathsView);
......
......@@ -89,6 +89,8 @@ public:
QStringList defines() const;
void setDefines(const QStringList &defines);
QStringList allIncludePaths() const;
QStringList projectIncludePaths() const;
QStringList files() const;
QStringList generated() const;
QString toolChainId() const;
......@@ -112,6 +114,7 @@ private:
QStringList _files;
QStringList _generated;
QStringList _includePaths;
QStringList _projectIncludePaths;
QStringList _defines;
GenericProjectNode* _rootNode;
......
......@@ -115,16 +115,21 @@ ProjectExplorer::FolderNode *GenericProjectNode::findOrCreateFolderByName(const
folderName += QLatin1Char('/'); // ### FIXME
}
FolderNode *folder = _folderByName.value(folderName);
if (! folder) {
folder = new FolderNode(components.at(end - 1));
_folderByName.insert(folderName, folder);
FolderNode *parent = findOrCreateFolderByName(components, end - 1);
if (! parent)
parent = this;
addFolderNodes(QList<FolderNode*>() << folder, parent);
}
const QString component = components.at(end - 1);
if (component.isEmpty())
return this;
else if (FolderNode *folder = _folderByName.value(folderName))
return folder;
FolderNode *folder = new FolderNode(component);
_folderByName.insert(folderName, folder);
FolderNode *parent = findOrCreateFolderByName(components, end - 1);
if (! parent)
parent = this;
addFolderNodes(QList<FolderNode*>() << folder, parent);
return folder;
}
......
#include "genericprojectwizard.h"
#include <coreplugin/icore.h>
#include <coreplugin/mimedatabase.h>
#include <projectexplorer/projectexplorer.h>
#include <utils/pathchooser.h>
#include <QtGui/QWizard>
#include <QtGui/QFormLayout>
#include <QtCore/QDir>
#include <QtCore/QtDebug>
#include <QtGui/QWizard>
#include <QtGui/QFormLayout>
#include <QtGui/QListView>
#include <QtGui/QTreeView>
#include <QtGui/QDirModel>
using namespace GenericProjectManager::Internal;
using namespace Core::Utils;
GenericProjectWizard::GenericProjectWizard()
: Core::BaseFileWizard(parameters())
namespace {
class DirModel: public QDirModel
{
public:
DirModel(QObject *parent)
: QDirModel(parent)
{ setFilter(QDir::Dirs | QDir::NoDotAndDotDot); }
virtual ~DirModel()
{ }
public:
virtual int columnCount(const QModelIndex &) const
{ return 1; }
virtual Qt::ItemFlags flags(const QModelIndex &index) const
{ return QDirModel::flags(index) | Qt::ItemIsUserCheckable; }
virtual QVariant data(const QModelIndex &index, int role) const
{
if (index.column() == 0 && role == Qt::CheckStateRole) {
if (_selectedPaths.contains(index))
return Qt::Checked;
return Qt::Unchecked;
}
return QDirModel::data(index, role);
}
virtual bool setData(const QModelIndex &index, const QVariant &value, int role)
{
if (index.column() == 0 && role == Qt::CheckStateRole) {
if (value.toBool())
_selectedPaths.insert(index);
else
_selectedPaths.remove(index);
return true;
}
return QDirModel::setData(index, value, role);
}
void clearSelectedPaths()
{ _selectedPaths.clear(); }
QSet<QString> selectedPaths() const
{
QSet<QString> paths;
foreach (const QModelIndex &index, _selectedPaths)
paths.insert(filePath(index));
return paths;
}
private:
QSet<QModelIndex> _selectedPaths;
};
} // end of anonymous namespace
//////////////////////////////////////////////////////////////////////////////
// GenericProjectWizardDialog
//////////////////////////////////////////////////////////////////////////////
GenericProjectWizardDialog::GenericProjectWizardDialog(QWidget *parent)
: QWizard(parent)
{
setWindowTitle(tr("Import Existing Project"));
// first page
QWizardPage *firstPage = new QWizardPage;
firstPage->setTitle(tr("Project"));
QFormLayout *layout = new QFormLayout(firstPage);
_pathChooser = new PathChooser;
layout->addRow(tr("Source Directory:"), _pathChooser);
_firstPageId = addPage(firstPage);
#if 0
// second page
QWizardPage *secondPage = new QWizardPage;
secondPage->setTitle(tr("Second Page Title"));
QFormLayout *secondPageLayout = new QFormLayout(secondPage);
_dirView = new QTreeView;
_dirModel = new DirModel(this);
_dirView->setModel(_dirModel);
Core::ICore *core = Core::ICore::instance();
Core::MimeDatabase *mimeDatabase = core->mimeDatabase();
const QStringList suffixes = mimeDatabase->suffixes();
QStringList nameFilters;
foreach (const QString &suffix, suffixes) {
QString nameFilter;
nameFilter.append(QLatin1String("*."));
nameFilter.append(suffix);
nameFilters.append(nameFilter);
}
_filesView = new QListView;
_filesModel = new QDirModel(this);
_filesModel->setNameFilters(nameFilters);
_filesModel->setFilter(QDir::Files);
connect(_dirView->selectionModel(), SIGNAL(currentChanged(QModelIndex,QModelIndex)),
this, SLOT(updateFilesView(QModelIndex,QModelIndex)));
secondPageLayout->addRow(_dirView);
secondPageLayout->addRow(_filesView);
_secondPageId = addPage(secondPage);
#endif
}
GenericProjectWizard::~GenericProjectWizard()
GenericProjectWizardDialog::~GenericProjectWizardDialog()
{ }
QString GenericProjectWizardDialog::path() const
{ return _pathChooser->path(); }
void GenericProjectWizardDialog::updateFilesView(const QModelIndex &current,
const QModelIndex &)
{
if (! current.isValid())
_filesView->setModel(0);
else {
const QString selectedPath = _dirModel->filePath(current);
if (! _filesView->model())
_filesView->setModel(_filesModel);
_filesView->setRootIndex(_filesModel->index(selectedPath));
}
}
void GenericProjectWizardDialog::initializePage(int id)
{
if (id == _secondPageId) {
using namespace Core::Utils;
const QString projectPath = _pathChooser->path();
QDirModel *dirModel = qobject_cast<QDirModel *>(_dirView->model());
_dirView->setRootIndex(dirModel->index(projectPath));
}
}
bool GenericProjectWizardDialog::validateCurrentPage()
{
using namespace Core::Utils;
if (currentId() == _firstPageId) {
return ! _pathChooser->path().isEmpty();
} else if (currentId() == _secondPageId) {
return true;
}
return QWizard::validateCurrentPage();
}
GenericProjectWizard::GenericProjectWizard()
: Core::BaseFileWizard(parameters())
{ }
GenericProjectWizard::~GenericProjectWizard()
{ }
Core::BaseFileWizardParameters GenericProjectWizard::parameters()
{
static Core::BaseFileWizardParameters parameters(ProjectWizard);
......@@ -35,42 +212,94 @@ QWizard *GenericProjectWizard::createWizardDialog(QWidget *parent,
const QString &defaultPath,
const WizardPageList &extensionPages) const
{
QWizard *wizard = new QWizard(parent);
wizard->setWindowTitle(tr("Import Existing Project"));
GenericProjectWizardDialog *wizard = new GenericProjectWizardDialog(parent);
setupWizard(wizard);
QWizardPage *firstPage = new QWizardPage;
firstPage->setTitle(tr("Project"));
foreach (QWizardPage *p, extensionPages)
wizard->addPage(p);
QFormLayout *layout = new QFormLayout(firstPage);
return wizard;
}
PathChooser *pathChooser = new PathChooser;
pathChooser->setObjectName("pathChooser");
layout->addRow(tr("Source Directory:"), pathChooser);
void GenericProjectWizard::getFileList(const QDir &dir, const QString &projectRoot,
const QStringList &suffixes,
QStringList *files, QStringList *paths) const
{
const QFileInfoList fileInfoList = dir.entryInfoList(QDir::Files |
QDir::Dirs |
QDir::NoDotAndDotDot |
QDir::NoSymLinks);
wizard->addPage(firstPage);
foreach (const QFileInfo &fileInfo, fileInfoList) {
QString filePath = fileInfo.absoluteFilePath();
filePath = filePath.mid(projectRoot.length() + 1);
foreach (QWizardPage *p, extensionPages)
wizard->addPage(p);
if (fileInfo.isDir() && isValidDir(fileInfo)) {
getFileList(QDir(fileInfo.absoluteFilePath()), projectRoot,
suffixes, files, paths);
return wizard;
if (! paths->contains(filePath))
paths->append(filePath);
}
else if (suffixes.contains(fileInfo.suffix()))
files->append(filePath);
}
}
bool GenericProjectWizard::isValidDir(const QFileInfo &fileInfo) const
{
const QString fileName = fileInfo.fileName();
const QString suffix = fileInfo.suffix();
if (fileName.startsWith(QLatin1Char('.')))
return false;
else if (fileName == QLatin1String("CVS"))
return false;
// ### user include/exclude
return true;
}
Core::GeneratedFiles GenericProjectWizard::generateFiles(const QWizard *w,
QString *errorMessage) const
{
PathChooser *pathChooser = w->findChild<PathChooser *>("pathChooser");
const QString projectName = QFileInfo(pathChooser->path()).baseName() + QLatin1String(".creator");
const QDir dir(pathChooser->path());
const GenericProjectWizardDialog *wizard = qobject_cast<const GenericProjectWizardDialog *>(w);
const QString projectPath = wizard->path();
const QString projectName = QFileInfo(projectPath).baseName() + QLatin1String(".creator");
const QDir dir(projectPath);
Core::ICore *core = Core::ICore::instance();
Core::MimeDatabase *mimeDatabase = core->mimeDatabase();
const QStringList suffixes = mimeDatabase->suffixes();
// ### FIXME: use the mimetype database.
// ### FIXME: import nested folders.
const QStringList sources = dir.entryList(QStringList() << "Makefile" << "*.c" << "*.cpp" << "*.h", QDir::Files);
QStringList sources, paths;
getFileList(dir, projectPath, suffixes, &sources, &paths);
Core::MimeType headerTy = mimeDatabase->findByType(QLatin1String("text/x-chdr"));
QStringList nameFilters;
foreach (const QRegExp &rx, headerTy.globPatterns())
nameFilters.append(rx.pattern());
QStringList includePaths;
foreach (const QString &path, paths) {
QFileInfo fileInfo(dir, path);
QDir thisDir(fileInfo.absoluteFilePath());
if (! thisDir.entryList(nameFilters, QDir::Files).isEmpty())
includePaths.append(path);
}
QString projectContents;
QTextStream stream(&projectContents);
stream << "files=" << sources.join(",");
stream << endl;
stream << "includePaths=" << includePaths.join(",");
stream << endl;
Core::GeneratedFile file(QFileInfo(dir, projectName).absoluteFilePath()); // ### fixme
file.setContents(projectContents);
......
......@@ -2,10 +2,53 @@
#define GENERICPROJECTWIZARD_H
#include <coreplugin/basefilewizard.h>
#include <utils/pathchooser.h>
#include <QWizard>
QT_BEGIN_NAMESPACE
class QListView;
class QTreeView;
class QDirModel;
class QModelIndex;
class QDir;
class QStringList;
class QFileInfo;
QT_END_NAMESPACE
namespace GenericProjectManager {
namespace Internal {
class GenericProjectWizardDialog: public QWizard
{
Q_OBJECT
public:
GenericProjectWizardDialog(QWidget *parent = 0);
virtual ~GenericProjectWizardDialog();
QString path() const;
private Q_SLOTS:
void updateFilesView(const QModelIndex &current,
const QModelIndex &previous);
protected:
virtual void initializePage(int id);
virtual bool validateCurrentPage();
private:
int _firstPageId;
int _secondPageId;
Core::Utils::PathChooser *_pathChooser;
QTreeView *_dirView;
QDirModel *_dirModel;
QListView *_filesView;
QDirModel *_filesModel;
};
class GenericProjectWizard : public Core::BaseFileWizard
{
Q_OBJECT
......@@ -25,6 +68,13 @@ protected:
QString *errorMessage) const;
virtual bool postGenerateFiles(const Core::GeneratedFiles &l, QString *errorMessage);
bool isValidDir(const QFileInfo &fileInfo) const;
void getFileList(const QDir &dir, const QString &projectRoot,
const QStringList &suffixes,
QStringList *files,
QStringList *paths) const;
};
} // end of namespace Internal
......
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