summaryrefslogtreecommitdiff
path: root/src/plugins/genericprojectmanager
diff options
context:
space:
mode:
authorRoberto Raggi <roberto.raggi@nokia.com>2009-03-13 15:12:54 +0100
committerRoberto Raggi <roberto.raggi@nokia.com>2009-03-13 15:12:54 +0100
commitd690a844b4080dd12f39d7eeaad02b693deb6c64 (patch)
treef2c87a7be10c6cce8c523960d369ad3dfcae1efe /src/plugins/genericprojectmanager
parent78210a5cc2a908e46a73937ff5b8fa211fc351ff (diff)
downloadqt-creator-d690a844b4080dd12f39d7eeaad02b693deb6c64.tar.gz
Imrpvoed the importer.
Diffstat (limited to 'src/plugins/genericprojectmanager')
-rw-r--r--src/plugins/genericprojectmanager/genericproject.cpp26
-rw-r--r--src/plugins/genericprojectmanager/genericproject.h3
-rw-r--r--src/plugins/genericprojectmanager/genericprojectnodes.cpp25
-rw-r--r--src/plugins/genericprojectmanager/genericprojectwizard.cpp275
-rw-r--r--src/plugins/genericprojectmanager/genericprojectwizard.h50
5 files changed, 343 insertions, 36 deletions
diff --git a/src/plugins/genericprojectmanager/genericproject.cpp b/src/plugins/genericprojectmanager/genericproject.cpp
index 28731fbcc5..5519007789 100644
--- a/src/plugins/genericprojectmanager/genericproject.cpp
+++ b/src/plugins/genericprojectmanager/genericproject.cpp
@@ -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);
diff --git a/src/plugins/genericprojectmanager/genericproject.h b/src/plugins/genericprojectmanager/genericproject.h
index 2c63d1945f..5ed588d7f0 100644
--- a/src/plugins/genericprojectmanager/genericproject.h
+++ b/src/plugins/genericprojectmanager/genericproject.h
@@ -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;
diff --git a/src/plugins/genericprojectmanager/genericprojectnodes.cpp b/src/plugins/genericprojectmanager/genericprojectnodes.cpp
index e37f1dd31f..d96c0d441e 100644
--- a/src/plugins/genericprojectmanager/genericprojectnodes.cpp
+++ b/src/plugins/genericprojectmanager/genericprojectnodes.cpp
@@ -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;
}
diff --git a/src/plugins/genericprojectmanager/genericprojectwizard.cpp b/src/plugins/genericprojectmanager/genericprojectwizard.cpp
index fd7007843a..d24ce1329b 100644
--- a/src/plugins/genericprojectmanager/genericprojectwizard.cpp
+++ b/src/plugins/genericprojectmanager/genericprojectwizard.cpp
@@ -1,25 +1,202 @@
#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);
diff --git a/src/plugins/genericprojectmanager/genericprojectwizard.h b/src/plugins/genericprojectmanager/genericprojectwizard.h
index e5bde8f086..6c3f87e16a 100644
--- a/src/plugins/genericprojectmanager/genericprojectwizard.h
+++ b/src/plugins/genericprojectmanager/genericprojectwizard.h
@@ -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