diff --git a/src/plugins/qt4projectmanager/projectloadwizard.cpp b/src/plugins/qt4projectmanager/projectloadwizard.cpp index 5797e99b1742c4a2db9ffefd718a2dde286f80ba..6fbe43eb57cd6dd799a884f2b8c0fbbe5f2debd0 100644 --- a/src/plugins/qt4projectmanager/projectloadwizard.cpp +++ b/src/plugins/qt4projectmanager/projectloadwizard.cpp @@ -89,14 +89,9 @@ void ProjectLoadWizard::setupTargetPage() if (m_targetSetupPage) return; - QList<TargetSetupPage::ImportInfo> importVersions = TargetSetupPage::scanDefaultProjectDirectories(m_project); - importVersions.append(TargetSetupPage::importInfosForKnownQtVersions(m_project->file()->fileName())); - m_targetSetupPage = new TargetSetupPage(this); m_targetSetupPage->setProFilePath(m_project->file()->fileName()); - m_targetSetupPage->setImportInfos(importVersions); - m_targetSetupPage->setImportDirectoryBrowsingEnabled(true); - m_targetSetupPage->setImportDirectoryBrowsingLocation(m_project->projectDirectory()); + m_targetSetupPage->setImportSearch(true); resize(900, 450); addPage(m_targetSetupPage); diff --git a/src/plugins/qt4projectmanager/qt-desktop/qt4desktoptargetfactory.cpp b/src/plugins/qt4projectmanager/qt-desktop/qt4desktoptargetfactory.cpp index b0dc98ca12d145825590b2268554503fbaec35b2..776ace2b51fe3f92304e80d2da1a3e0e35fa82c4 100644 --- a/src/plugins/qt4projectmanager/qt-desktop/qt4desktoptargetfactory.cpp +++ b/src/plugins/qt4projectmanager/qt-desktop/qt4desktoptargetfactory.cpp @@ -42,8 +42,10 @@ #include <projectexplorer/customexecutablerunconfiguration.h> #include <projectexplorer/projectexplorerconstants.h> +#include <QtGui/QVBoxLayout> #include <QtGui/QApplication> #include <QtGui/QStyle> +#include <QtGui/QLabel> using namespace Qt4ProjectManager; using namespace Qt4ProjectManager::Internal; @@ -67,7 +69,7 @@ bool Qt4DesktopTargetFactory::supportsTargetId(const QString &id) const QStringList Qt4DesktopTargetFactory::supportedTargetIds(ProjectExplorer::Project *parent) const { - if (!qobject_cast<Qt4Project *>(parent)) + if (parent && !qobject_cast<Qt4Project *>(parent)) return QStringList(); if (!QtVersionManager::instance()->supportsTargetId(Constants::DESKTOP_TARGET_ID)) return QStringList(); @@ -126,23 +128,31 @@ QString Qt4DesktopTargetFactory::defaultShadowBuildDirectory(const QString &proj return projectLocation + QLatin1String("-desktop"); } -QList<BuildConfigurationInfo> Qt4DesktopTargetFactory::availableBuildConfigurations(const QString &proFilePath) +QList<BuildConfigurationInfo> Qt4DesktopTargetFactory::availableBuildConfigurations(const QString &id, const QString &proFilePath, const QtVersionNumber &minimumQtVersion) { + Q_ASSERT(id == Constants::DESKTOP_TARGET_ID); QList<BuildConfigurationInfo> infos; - QList<QtVersion *> knownVersions = QtVersionManager::instance()->versionsForTargetId(Constants::DESKTOP_TARGET_ID); + QList<QtVersion *> knownVersions = QtVersionManager::instance()->versionsForTargetId(id, minimumQtVersion); foreach (QtVersion *version, knownVersions) { if (!version->isValid()) continue; QtVersion::QmakeBuildConfigs config = version->defaultBuildConfig(); - QString dir = defaultShadowBuildDirectory(Qt4Project::defaultTopLevelBuildDirectory(proFilePath), Constants::DESKTOP_TARGET_ID); + QString dir = defaultShadowBuildDirectory(Qt4Project::defaultTopLevelBuildDirectory(proFilePath), id); infos.append(BuildConfigurationInfo(version, config, QString(), dir)); infos.append(BuildConfigurationInfo(version, config ^ QtVersion::DebugBuild, QString(), dir)); } return infos; } +Qt4TargetSetupWidget *Qt4DesktopTargetFactory::createTargetSetupWidget(const QString &id, const QString &proFilePath, const QtVersionNumber &number, bool importEnabled, QList<BuildConfigurationInfo> importInfos) +{ + Qt4DefaultTargetSetupWidget *widget = new Qt4DefaultTargetSetupWidget(this, id, proFilePath, number, importEnabled, importInfos); + widget->setShadowBuildCheckBoxVisible(true); + return widget; +} + Qt4BaseTarget *Qt4DesktopTargetFactory::create(ProjectExplorer::Project *parent, const QString &id) { if (!canCreate(parent, id)) @@ -162,10 +172,18 @@ Qt4BaseTarget *Qt4DesktopTargetFactory::create(ProjectExplorer::Project *parent, return create(parent, id, infos); } -Qt4BaseTarget *Qt4DesktopTargetFactory::create(ProjectExplorer::Project *parent, const QString &id, QList<BuildConfigurationInfo> infos) +bool Qt4DesktopTargetFactory::isMobileTarget(const QString &id) +{ + Q_UNUSED(id) + return false; +} + +Qt4BaseTarget *Qt4DesktopTargetFactory::create(ProjectExplorer::Project *parent, const QString &id, const QList<BuildConfigurationInfo> &infos) { if (!canCreate(parent, id)) return 0; + if (infos.isEmpty()) + return 0; Qt4DesktopTarget *t = new Qt4DesktopTarget(static_cast<Qt4Project *>(parent), id); foreach (const BuildConfigurationInfo &info, infos) diff --git a/src/plugins/qt4projectmanager/qt-desktop/qt4desktoptargetfactory.h b/src/plugins/qt4projectmanager/qt-desktop/qt4desktoptargetfactory.h index 2c99a7822bf7d7a1f43c914432ade31fbd88505d..48f2778a7e581075be6fc9fc96d75847a9b84f94 100644 --- a/src/plugins/qt4projectmanager/qt-desktop/qt4desktoptargetfactory.h +++ b/src/plugins/qt4projectmanager/qt-desktop/qt4desktoptargetfactory.h @@ -56,11 +56,13 @@ public: virtual bool supportsTargetId(const QString &id) const; - QList<BuildConfigurationInfo> availableBuildConfigurations(const QString &proFilePath); + Qt4TargetSetupWidget *createTargetSetupWidget(const QString &id, const QString &proFilePath, const QtVersionNumber &minimumQtVersion, bool importEnabled, QList<BuildConfigurationInfo> importInfos); + bool isMobileTarget(const QString &id); + QList<BuildConfigurationInfo> availableBuildConfigurations(const QString &id, const QString &proFilePath, const QtVersionNumber &minimumQtVersion); Qt4BaseTarget *create(ProjectExplorer::Project *parent, const QString &id); - Qt4BaseTarget *create(ProjectExplorer::Project *parent, const QString &id, QList<BuildConfigurationInfo> infos); + Qt4BaseTarget *create(ProjectExplorer::Project *parent, const QString &id, const QList<BuildConfigurationInfo> &infos); + }; } } - #endif // QT4DESKTOPTARGETFACTORY_H diff --git a/src/plugins/qt4projectmanager/qt-desktop/qt4simulatortargetfactory.cpp b/src/plugins/qt4projectmanager/qt-desktop/qt4simulatortargetfactory.cpp index 3061a95d592b877320e589e23856df03b74b5c79..7a0c7a150c993b512ed4c1d93f24b97b691d90fd 100644 --- a/src/plugins/qt4projectmanager/qt-desktop/qt4simulatortargetfactory.cpp +++ b/src/plugins/qt4projectmanager/qt-desktop/qt4simulatortargetfactory.cpp @@ -70,7 +70,7 @@ bool Qt4SimulatorTargetFactory::supportsTargetId(const QString &id) const QStringList Qt4SimulatorTargetFactory::supportedTargetIds(ProjectExplorer::Project *parent) const { - if (!qobject_cast<Qt4Project *>(parent)) + if (parent && !qobject_cast<Qt4Project *>(parent)) return QStringList(); if (!QtVersionManager::instance()->supportsTargetId(Constants::QT_SIMULATOR_TARGET_ID)) return QStringList(); @@ -128,22 +128,29 @@ QString Qt4SimulatorTargetFactory::defaultShadowBuildDirectory(const QString &pr return projectLocation + QLatin1String("-simulator"); } -QList<BuildConfigurationInfo> Qt4SimulatorTargetFactory::availableBuildConfigurations(const QString &proFilePath) +QList<BuildConfigurationInfo> Qt4SimulatorTargetFactory::availableBuildConfigurations(const QString &id, const QString &proFilePath, const QtVersionNumber &minimumQtVersion) { + Q_ASSERT(id == Constants::QT_SIMULATOR_TARGET_ID); QList<BuildConfigurationInfo> infos; - QList<QtVersion *> knownVersions = QtVersionManager::instance()->versionsForTargetId(Constants::QT_SIMULATOR_TARGET_ID); + QList<QtVersion *> knownVersions = QtVersionManager::instance()->versionsForTargetId(id, minimumQtVersion); foreach (QtVersion *version, knownVersions) { if (!version->isValid()) continue; QtVersion::QmakeBuildConfigs config = version->defaultBuildConfig(); - QString dir = defaultShadowBuildDirectory(Qt4Project::defaultTopLevelBuildDirectory(proFilePath), Constants::QT_SIMULATOR_TARGET_ID); + QString dir = defaultShadowBuildDirectory(Qt4Project::defaultTopLevelBuildDirectory(proFilePath), id); infos.append(BuildConfigurationInfo(version, config, QString(), dir)); infos.append(BuildConfigurationInfo(version, config ^ QtVersion::DebugBuild, QString(), dir)); } return infos; } +bool Qt4SimulatorTargetFactory::isMobileTarget(const QString &id) +{ + Q_UNUSED(id) + return true; +} + Qt4BaseTarget *Qt4SimulatorTargetFactory::create(ProjectExplorer::Project *parent, const QString &id) { if (!canCreate(parent, id)) @@ -162,10 +169,12 @@ Qt4BaseTarget *Qt4SimulatorTargetFactory::create(ProjectExplorer::Project *paren return create(parent, id, infos); } -Qt4BaseTarget *Qt4SimulatorTargetFactory::create(ProjectExplorer::Project *parent, const QString &id, QList<BuildConfigurationInfo> infos) +Qt4BaseTarget *Qt4SimulatorTargetFactory::create(ProjectExplorer::Project *parent, const QString &id, const QList<BuildConfigurationInfo> &infos) { if (!canCreate(parent, id)) return 0; + if (infos.isEmpty()) + return 0; Qt4SimulatorTarget *t = new Qt4SimulatorTarget(static_cast<Qt4Project *>(parent), id); foreach (const BuildConfigurationInfo &info, infos) diff --git a/src/plugins/qt4projectmanager/qt-desktop/qt4simulatortargetfactory.h b/src/plugins/qt4projectmanager/qt-desktop/qt4simulatortargetfactory.h index 0f560a6ee003da4e7a8c9f6992acbb733feef070..09fc6b12403563d467c0eaae5a1a42d6213da157 100644 --- a/src/plugins/qt4projectmanager/qt-desktop/qt4simulatortargetfactory.h +++ b/src/plugins/qt4projectmanager/qt-desktop/qt4simulatortargetfactory.h @@ -56,11 +56,12 @@ public: Qt4ProjectManager::Qt4BaseTarget *restore(ProjectExplorer::Project *parent, const QVariantMap &map); QString defaultShadowBuildDirectory(const QString &projectLocation, const QString &id); - virtual bool supportsTargetId(const QString &id) const; + bool supportsTargetId(const QString &id) const; - QList<BuildConfigurationInfo> availableBuildConfigurations(const QString &proFilePath); + QList<BuildConfigurationInfo> availableBuildConfigurations(const QString &id, const QString &proFilePath, const QtVersionNumber &minimumQtVersion); + bool isMobileTarget(const QString &id); Qt4BaseTarget *create(ProjectExplorer::Project *parent, const QString &id); - Qt4BaseTarget *create(ProjectExplorer::Project *parent, const QString &id, QList<BuildConfigurationInfo> infos); + Qt4BaseTarget *create(ProjectExplorer::Project *parent, const QString &id, const QList<BuildConfigurationInfo> &infos); }; } diff --git a/src/plugins/qt4projectmanager/qt-maemo/qt4maemotargetfactory.cpp b/src/plugins/qt4projectmanager/qt-maemo/qt4maemotargetfactory.cpp index 4dbfe011abd876a1bbca3d19533d2c9b58e14fd2..b485fb6febe5ea81aef1146131764c4a4ed88004 100644 --- a/src/plugins/qt4projectmanager/qt-maemo/qt4maemotargetfactory.cpp +++ b/src/plugins/qt4projectmanager/qt-maemo/qt4maemotargetfactory.cpp @@ -44,8 +44,6 @@ #include <projectexplorer/projectexplorerconstants.h> #include <projectexplorer/customexecutablerunconfiguration.h> -#include <QtGui/QApplication> - using namespace Qt4ProjectManager; using namespace Qt4ProjectManager::Internal; using ProjectExplorer::idFromMap; @@ -72,7 +70,7 @@ bool Qt4MaemoTargetFactory::supportsTargetId(const QString &id) const QStringList Qt4MaemoTargetFactory::supportedTargetIds(ProjectExplorer::Project *parent) const { QStringList targetIds; - if (!qobject_cast<Qt4Project *>(parent)) + if (parent && !qobject_cast<Qt4Project *>(parent)) return targetIds; if (QtVersionManager::instance()->supportsTargetId(QLatin1String(Constants::MAEMO5_DEVICE_TARGET_ID))) targetIds << QLatin1String(Constants::MAEMO5_DEVICE_TARGET_ID); @@ -151,19 +149,10 @@ QString Qt4MaemoTargetFactory::defaultShadowBuildDirectory(const QString &projec return projectLocation + QLatin1Char('-') + suffix; } -QList<BuildConfigurationInfo> Qt4MaemoTargetFactory::availableBuildConfigurations(const QString &proFilePath) -{ - return QList<BuildConfigurationInfo>() - << availableBuildConfigurations(proFilePath, QLatin1String(Constants::MAEMO5_DEVICE_TARGET_ID)) - << availableBuildConfigurations(proFilePath, QLatin1String(Constants::HARMATTAN_DEVICE_TARGET_ID)) - << availableBuildConfigurations(proFilePath, QLatin1String(Constants::MEEGO_DEVICE_TARGET_ID)); -} - -QList<BuildConfigurationInfo> Qt4MaemoTargetFactory::availableBuildConfigurations(const QString &proFilePath, - const QString &id) +QList<BuildConfigurationInfo> Qt4MaemoTargetFactory::availableBuildConfigurations(const QString &id, const QString &proFilePath, const QtVersionNumber &minimumQtVersion) { QList<BuildConfigurationInfo> infos; - QList<QtVersion *> knownVersions = QtVersionManager::instance()->versionsForTargetId(id); + QList<QtVersion *> knownVersions = QtVersionManager::instance()->versionsForTargetId(id, minimumQtVersion); foreach (QtVersion *version, knownVersions) { if (!version->isValid()) @@ -176,6 +165,12 @@ QList<BuildConfigurationInfo> Qt4MaemoTargetFactory::availableBuildConfiguration return infos; } +bool Qt4MaemoTargetFactory::isMobileTarget(const QString &id) +{ + Q_UNUSED(id) + return true; +} + Qt4BaseTarget *Qt4MaemoTargetFactory::create(ProjectExplorer::Project *parent, const QString &id) { if (!canCreate(parent, id)) @@ -196,7 +191,7 @@ Qt4BaseTarget *Qt4MaemoTargetFactory::create(ProjectExplorer::Project *parent, c } Qt4BaseTarget *Qt4MaemoTargetFactory::create(ProjectExplorer::Project *parent, - const QString &id, QList<BuildConfigurationInfo> infos) + const QString &id, const QList<BuildConfigurationInfo> &infos) { if (!canCreate(parent, id)) return 0; diff --git a/src/plugins/qt4projectmanager/qt-maemo/qt4maemotargetfactory.h b/src/plugins/qt4projectmanager/qt-maemo/qt4maemotargetfactory.h index 819de2b09e28079aacbb7e83035aabae00f4db90..fbf02731a85caf16b8c68547174f01a4cbe6840f 100644 --- a/src/plugins/qt4projectmanager/qt-maemo/qt4maemotargetfactory.h +++ b/src/plugins/qt4projectmanager/qt-maemo/qt4maemotargetfactory.h @@ -55,15 +55,13 @@ public: Qt4ProjectManager::Qt4BaseTarget *restore(ProjectExplorer::Project *parent, const QVariantMap &map); QString defaultShadowBuildDirectory(const QString &projectLocation, const QString &id); - virtual bool supportsTargetId(const QString &id) const; + bool supportsTargetId(const QString &id) const; - QList<BuildConfigurationInfo> availableBuildConfigurations(const QString &proFilePath); Qt4BaseTarget *create(ProjectExplorer::Project *parent, const QString &id); - Qt4BaseTarget *create(ProjectExplorer::Project *parent, const QString &id, QList<BuildConfigurationInfo> infos); + Qt4BaseTarget *create(ProjectExplorer::Project *parent, const QString &id, const QList<BuildConfigurationInfo> &infos); -private: - QList<BuildConfigurationInfo> availableBuildConfigurations(const QString &proFilePath, - const QString &id); + QList<BuildConfigurationInfo> availableBuildConfigurations(const QString &id, const QString &proFilePath, const QtVersionNumber &minimumQtVersion); + bool isMobileTarget(const QString &id); }; } // namespace Internal diff --git a/src/plugins/qt4projectmanager/qt-s60/qt4symbiantargetfactory.cpp b/src/plugins/qt4projectmanager/qt-s60/qt4symbiantargetfactory.cpp index 767c068bd6425fa8db01a644a8c3faf369a90340..7766ca4b211060ab5fb3bf25bcd794a6facb6501 100644 --- a/src/plugins/qt4projectmanager/qt-s60/qt4symbiantargetfactory.cpp +++ b/src/plugins/qt4projectmanager/qt-s60/qt4symbiantargetfactory.cpp @@ -72,7 +72,7 @@ bool Qt4SymbianTargetFactory::supportsTargetId(const QString &id) const QStringList Qt4SymbianTargetFactory::supportedTargetIds(ProjectExplorer::Project *parent) const { - if (!qobject_cast<Qt4Project *>(parent)) + if (parent && !qobject_cast<Qt4Project *>(parent)) return QStringList(); QStringList ids; @@ -139,33 +139,34 @@ QString Qt4SymbianTargetFactory::defaultShadowBuildDirectory(const QString &proj return projectLocation + QChar('-') + shortName; } -QList<BuildConfigurationInfo> Qt4SymbianTargetFactory::availableBuildConfigurations(const QString &proFilePath) +QList<BuildConfigurationInfo> Qt4SymbianTargetFactory::availableBuildConfigurations(const QString &id, const QString &proFilePath, const QtVersionNumber &minimumQtVersion) { QList<BuildConfigurationInfo> infos; - QList<QtVersion *> knownVersions = QtVersionManager::instance()->versionsForTargetId(Constants::S60_EMULATOR_TARGET_ID); + QList<QtVersion *> knownVersions = QtVersionManager::instance()->versionsForTargetId(id, minimumQtVersion); foreach (QtVersion *version, knownVersions) { if (!version->isValid()) continue; bool buildAll = version->defaultBuildConfig() & QtVersion::BuildAll; QtVersion::QmakeBuildConfigs config = buildAll ? QtVersion::BuildAll : QtVersion::QmakeBuildConfig(0); - QString dir = defaultShadowBuildDirectory(Qt4Project::defaultTopLevelBuildDirectory(proFilePath), Constants::S60_EMULATOR_TARGET_ID); - infos.append(BuildConfigurationInfo(version, config | QtVersion::DebugBuild, QString(), dir)); - } - - knownVersions = QtVersionManager::instance()->versionsForTargetId(Constants::S60_DEVICE_TARGET_ID); - foreach (QtVersion *version, knownVersions) { - if (!version->isValid()) - continue; - QtVersion::QmakeBuildConfigs config = version->defaultBuildConfig(); - QString dir = defaultShadowBuildDirectory(Qt4Project::defaultTopLevelBuildDirectory(proFilePath), Constants::S60_DEVICE_TARGET_ID); - infos.append(BuildConfigurationInfo(version, config, QString(), dir)); - infos.append(BuildConfigurationInfo(version, config ^ QtVersion::DebugBuild, QString(), dir)); + QString dir = defaultShadowBuildDirectory(Qt4Project::defaultTopLevelBuildDirectory(proFilePath), id); + if (id == Constants::S60_EMULATOR_TARGET_ID) { + infos.append(BuildConfigurationInfo(version, config | QtVersion::DebugBuild, QString(), dir)); + } else { + infos.append(BuildConfigurationInfo(version, config, QString(), dir)); + infos.append(BuildConfigurationInfo(version, config ^ QtVersion::DebugBuild, QString(), dir)); + } } return infos; } +bool Qt4SymbianTargetFactory::isMobileTarget(const QString &id) +{ + Q_UNUSED(id) + return true; +} + Qt4BaseTarget *Qt4SymbianTargetFactory::create(ProjectExplorer::Project *parent, const QString &id) { if (!canCreate(parent, id)) @@ -192,7 +193,7 @@ Qt4BaseTarget *Qt4SymbianTargetFactory::create(ProjectExplorer::Project *parent, return create(parent, id, infos); } -Qt4BaseTarget *Qt4SymbianTargetFactory::create(ProjectExplorer::Project *parent, const QString &id, QList<BuildConfigurationInfo> infos) +Qt4BaseTarget *Qt4SymbianTargetFactory::create(ProjectExplorer::Project *parent, const QString &id, const QList<BuildConfigurationInfo> &infos) { if (!canCreate(parent, id)) return 0; @@ -210,3 +211,11 @@ Qt4BaseTarget *Qt4SymbianTargetFactory::create(ProjectExplorer::Project *parent, t->addRunConfiguration(new ProjectExplorer::CustomExecutableRunConfiguration(t)); return t; } + +Qt4BaseTarget *Qt4SymbianTargetFactory::create(ProjectExplorer::Project *parent, const QString &id, Qt4TargetSetupWidget *widget) +{ + if (!widget->isTargetSelected()) + return 0; + Qt4DefaultTargetSetupWidget *w = static_cast<Qt4DefaultTargetSetupWidget *>(widget); + return create(parent, id, w->buildConfigurationInfos()); +} diff --git a/src/plugins/qt4projectmanager/qt-s60/qt4symbiantargetfactory.h b/src/plugins/qt4projectmanager/qt-s60/qt4symbiantargetfactory.h index f591a2b4b45a7697b73359027ce2060370626e27..923efb329aa08b1b37d6292f2db3ad51aa4441ba 100644 --- a/src/plugins/qt4projectmanager/qt-s60/qt4symbiantargetfactory.h +++ b/src/plugins/qt4projectmanager/qt-s60/qt4symbiantargetfactory.h @@ -52,13 +52,15 @@ public: bool canCreate(ProjectExplorer::Project *parent, const QString &id) const; bool canRestore(ProjectExplorer::Project *parent, const QVariantMap &map) const; - Qt4ProjectManager::Qt4BaseTarget *restore(ProjectExplorer::Project *parent, const QVariantMap &map); + Qt4BaseTarget *create(ProjectExplorer::Project *parent, const QString &id); - Qt4BaseTarget *create(ProjectExplorer::Project *parent, const QString &id, QList<BuildConfigurationInfo> infos); + Qt4BaseTarget *create(ProjectExplorer::Project *parent, const QString &id, const QList<BuildConfigurationInfo> &infos); + Qt4BaseTarget *create(ProjectExplorer::Project *parent, const QString &id, Qt4TargetSetupWidget *widget); QString defaultShadowBuildDirectory(const QString &projectLocation, const QString &id); - QList<BuildConfigurationInfo> availableBuildConfigurations(const QString &proFilePath); + QList<BuildConfigurationInfo> availableBuildConfigurations(const QString &id, const QString &proFilePath, const QtVersionNumber &minimumQtVersion); + bool isMobileTarget(const QString &id); }; } // namespace Internal diff --git a/src/plugins/qt4projectmanager/qt-s60/s60symbiancertificate.cpp b/src/plugins/qt4projectmanager/qt-s60/s60symbiancertificate.cpp index f60288555c7c37826f3ac5eb32594f35d4d48ea8..26f0e23f47ae68e10c577b2b1f92a8ee44bd89b4 100644 --- a/src/plugins/qt4projectmanager/qt-s60/s60symbiancertificate.cpp +++ b/src/plugins/qt4projectmanager/qt-s60/s60symbiancertificate.cpp @@ -67,7 +67,7 @@ namespace { /* * X.509 S60 Certificate Extension */ -class S60CertificateExtension : public Certificate_Extension +class S60CertificateExtension : Certificate_Extension { public: OID oid_of() const; diff --git a/src/plugins/qt4projectmanager/qt4target.cpp b/src/plugins/qt4projectmanager/qt4target.cpp index 1549a670d98cdc02502a2c339df40675e6bd5bcc..e220109fef8f14d065621f086c7cb7d16b1b8411 100644 --- a/src/plugins/qt4projectmanager/qt4target.cpp +++ b/src/plugins/qt4projectmanager/qt4target.cpp @@ -39,12 +39,21 @@ #include "qt4projectmanagerconstants.h" #include "qt4projectconfigwidget.h" +#include <coreplugin/icore.h> #include <extensionsystem/pluginmanager.h> #include <projectexplorer/buildsteplist.h> #include <projectexplorer/runconfiguration.h> #include <projectexplorer/customexecutablerunconfiguration.h> #include <projectexplorer/toolchainmanager.h> #include <projectexplorer/projectexplorerconstants.h> +#include <projectexplorer/task.h> +#include <utils/pathchooser.h> +#include <utils/detailswidget.h> + +#include <QtGui/QPushButton> +#include <QtGui/QMessageBox> +#include <QtGui/QCheckBox> +#include <QtGui/QMainWindow> using namespace Qt4ProjectManager; using namespace Qt4ProjectManager::Internal; @@ -64,6 +73,24 @@ Qt4BaseTargetFactory::~Qt4BaseTargetFactory() } +Qt4TargetSetupWidget *Qt4BaseTargetFactory::createTargetSetupWidget(const QString &id, + const QString &proFilePath, + const QtVersionNumber &number, + bool importEnabled, + QList<BuildConfigurationInfo> importInfos) +{ + return new Qt4DefaultTargetSetupWidget(this, id, proFilePath, number, importEnabled, importInfos); +} + +Qt4BaseTarget *Qt4BaseTargetFactory::create(ProjectExplorer::Project *parent, const QString &id, Qt4TargetSetupWidget *widget) +{ + if (!widget->isTargetSelected()) + return 0; + Q_ASSERT(qobject_cast<Qt4DefaultTargetSetupWidget *>(widget)); + Qt4DefaultTargetSetupWidget *w = static_cast<Qt4DefaultTargetSetupWidget *>(widget); + return create(parent, id, w->buildConfigurationInfos()); +} + Qt4BaseTargetFactory *Qt4BaseTargetFactory::qt4BaseTargetFactoryForId(const QString &id) { QList<Qt4BaseTargetFactory *> factories = ExtensionSystem::PluginManager::instance()->getObjects<Qt4BaseTargetFactory>(); @@ -229,3 +256,534 @@ void Qt4BaseTarget::emitProFileEvaluateNeeded() { emit proFileEvaluateNeeded(this); } + +// ------------------------------------------------------------------------- +// Qt4TargetSetupWidget +// ------------------------------------------------------------------------- + +Qt4TargetSetupWidget::Qt4TargetSetupWidget() + : QWidget(0) +{ + +} + +Qt4TargetSetupWidget::~Qt4TargetSetupWidget() +{ + +} + +// ------------------------------------------------------------------------- +// Qt4DefaultTargetSetupWidget +// ------------------------------------------------------------------------- + +Qt4DefaultTargetSetupWidget::Qt4DefaultTargetSetupWidget(Qt4BaseTargetFactory *factory, + const QString &id, + const QString &proFilePath, + const QtVersionNumber &minimumQtVersion, + bool importEnabled, + QList<BuildConfigurationInfo> importInfos) + : Qt4TargetSetupWidget(), + m_id(id), + m_factory(factory), + m_proFilePath(proFilePath), + m_minimumQtVersion(minimumQtVersion), + m_importInfos(importInfos), + m_directoriesEnabled(true), + m_hasInSourceBuild(false), + m_ignoreChange(false), + m_showImport(importEnabled), + m_selected(0) +{ + QString sourceDir = QFileInfo(m_proFilePath).absolutePath(); + + setSizePolicy(QSizePolicy::Preferred, QSizePolicy::Fixed); + QVBoxLayout *vboxLayout = new QVBoxLayout(); + vboxLayout->setMargin(0); + setLayout(vboxLayout); + m_detailsWidget = new Utils::DetailsWidget(this); + m_detailsWidget->setSummaryText(factory->displayNameForId(id)); + m_detailsWidget->setUseCheckBox(true); + m_detailsWidget->setChecked(true); + m_detailsWidget->setSummaryFontBold(true); + m_detailsWidget->setIcon(factory->iconForId(id)); + vboxLayout->addWidget(m_detailsWidget); + + QWidget *widget = new QWidget; + QVBoxLayout *layout = new QVBoxLayout; + widget->setLayout(layout); + + m_importLayout = new QGridLayout; + m_importLayout->setMargin(0); + layout->addLayout(m_importLayout); + + m_importLineLayout = new QHBoxLayout(); + m_importLineLabel = new QLabel(); + m_importLineLabel->setText(tr("Import build from:")); + m_importLineLayout->addWidget(m_importLineLabel); + + m_importLinePath = new Utils::PathChooser(); + m_importLinePath->setExpectedKind(Utils::PathChooser::ExistingDirectory); + m_importLinePath->setPath(sourceDir); + m_importLineLayout->addWidget(m_importLinePath); + + m_importLineButton = new QPushButton; + m_importLineButton->setText(tr("Add Build")); + m_importLineLayout->addWidget(m_importLineButton); + layout->addLayout(m_importLineLayout); + + if (!m_showImport) { + m_importLineLabel->setVisible(false); + m_importLinePath->setVisible(false); + m_importLineButton->setVisible(false); + } + + m_spacerTopWidget = new QWidget; + m_spacerTopWidget->setMinimumHeight(12); + layout->addWidget(m_spacerTopWidget); + + m_shadowBuildEnabled = new QCheckBox; + m_shadowBuildEnabled->setText(tr("Use Shadow Building")); + m_shadowBuildEnabled->setChecked(true); + m_shadowBuildEnabled->setVisible(false); + layout->addWidget(m_shadowBuildEnabled); + + m_spacerBottomWidget = new QWidget; + m_spacerBottomWidget->setMinimumHeight(0); + layout->addWidget(m_spacerBottomWidget); + + m_newBuildsLayout = new QGridLayout; + m_newBuildsLayout->setMargin(0); + layout->addLayout(m_newBuildsLayout); + + m_spacerTopWidget->setVisible(false); + m_spacerBottomWidget->setVisible(false); + + m_detailsWidget->setWidget(widget); + + for (int i = 0; i < m_importInfos.size(); ++i) { + if (m_importInfos.at(i).directory == sourceDir) + m_hasInSourceBuild = true; + m_importEnabled << true; + } + + m_selected += m_importInfos.size(); + + setupImportWidgets(); + + setBuildConfigurationInfos(factory->availableBuildConfigurations(id, proFilePath, minimumQtVersion)); + + if (!m_importInfos.isEmpty()) + m_detailsWidget->setState(Utils::DetailsWidget::Expanded); + + connect(m_importLineButton, SIGNAL(clicked()), + this, SLOT(addImportClicked())); + + connect(m_detailsWidget, SIGNAL(checked(bool)), + this, SIGNAL(selectedToggled())); + connect(m_detailsWidget, SIGNAL(checked(bool)), + widget, SLOT(setEnabled(bool))); + connect(m_shadowBuildEnabled, SIGNAL(toggled(bool)), + this, SLOT(shadowBuildingToggled())); + +} + +Qt4DefaultTargetSetupWidget::~Qt4DefaultTargetSetupWidget() +{ +} + +bool Qt4DefaultTargetSetupWidget::isTargetSelected() const +{ + return m_detailsWidget->isChecked() && m_selected; +} + +void Qt4DefaultTargetSetupWidget::setTargetSelected(bool b) +{ + // Only check target if there are build configurations possible + b == b && !buildConfigurationInfos().isEmpty(); + m_detailsWidget->setChecked(b); + // We want the shadow build option to be visible + if (m_shadowBuildEnabled->isVisible() && b) + m_detailsWidget->setState(Utils::DetailsWidget::Expanded); +} + +QString Qt4DefaultTargetSetupWidget::displayNameFrom(const BuildConfigurationInfo &info) +{ + QString buildType; + if ((info.buildConfig & QtVersion::BuildAll) == 0) { + if (info.buildConfig & QtVersion::DebugBuild) + //: Debug build + buildType = tr("debug"); + else + //: release build + buildType = tr("release"); + } + return info.version->displayName() + " " + buildType; +} + +void Qt4DefaultTargetSetupWidget::setProFilePath(const QString &proFilePath) +{ + m_proFilePath = proFilePath; + setBuildConfigurationInfos(m_factory->availableBuildConfigurations(m_id, proFilePath, m_minimumQtVersion), false); +} + +void Qt4DefaultTargetSetupWidget::setShadowBuildCheckBoxVisible(bool b) +{ + m_shadowBuildEnabled->setVisible(b); + m_spacerTopWidget->setVisible(b && !m_importInfos.isEmpty()); + m_spacerBottomWidget->setVisible(b); + m_shadowBuildEnabled->setChecked(!m_hasInSourceBuild); +} + +QList<BuildConfigurationInfo> Qt4DefaultTargetSetupWidget::buildConfigurationInfos() const +{ + QList<BuildConfigurationInfo> infos; + for (int i = 0; i < m_importInfos.size(); ++i) { + if (m_importEnabled.at(i)) + infos << m_importInfos.at(i); + } + + QString sourceDir = QFileInfo(m_proFilePath).absolutePath(); + + int size = m_infos.size(); + for (int i=0; i < size; ++i) { + if (m_enabled.at(i)) { + BuildConfigurationInfo info = m_infos.at(i); + if (m_shadowBuildEnabled->isChecked()) + info.directory = sourceDir; + infos << info; + } + } + return infos; +} + +void Qt4DefaultTargetSetupWidget::addImportClicked() +{ + BuildConfigurationInfo info = BuildConfigurationInfo::checkForBuild(m_importLinePath->path(), m_proFilePath); + if (!info.isValid()) { + QMessageBox::critical(Core::ICore::instance()->mainWindow(), + tr("No build found"), + tr("No Build found in %1 matching project %2.").arg(m_importLinePath->path()).arg(m_proFilePath)); + return; + } + + if (!info.version->supportsTargetId(m_id)) { + QMessageBox::critical(Core::ICore::instance()->mainWindow(), + tr("Incompatible build found"), + tr("The Build found in %1 is incompatible with this target").arg(m_importLinePath->path())); + return; + } + ++m_selected; + m_importEnabled << true; + + m_importInfos << info; + + createImportWidget(info, m_importEnabled.size() - 1); + emit newImportBuildConfiguration(info); +} + +QList<BuildConfigurationInfo> Qt4DefaultTargetSetupWidget::usedImportInfos() +{ + QList<BuildConfigurationInfo> infos; + for (int i = 0; i < m_importInfos.size(); ++i) { + if (m_importEnabled.at(i)) + infos << m_importInfos.at(i); + } + return infos; +} + +void Qt4DefaultTargetSetupWidget::setBuildConfigurationInfos(const QList<BuildConfigurationInfo> &infos, bool resetEnabled) +{ + m_infos = infos; + if (resetEnabled || m_infos.size() != m_enabled.size()) { + m_enabled.clear(); + m_selected = 0; + QStringList existingBuilds; + for (int i = 0; i < m_importInfos.size(); ++i) { + const BuildConfigurationInfo &info = m_importInfos.at(i); + existingBuilds << info.directory; + if (m_importEnabled.at(i)) + ++m_selected; + } + + // Default to importing existing builds and disable + // builds that would overwrite imports + for (int i=0; i < m_infos.size(); ++i) { + if (existingBuilds.contains(m_infos.at(i).directory) || m_hasInSourceBuild) { + m_enabled << false; + } else { + m_enabled << true; + ++m_selected; + } + } + + clearWidgets(); + setupWidgets(); + } else { + m_ignoreChange = true; + QString sourceDir = QFileInfo(m_proFilePath).absolutePath(); + for (int i=0; i < m_checkboxes.size(); ++i) { + const BuildConfigurationInfo &info = m_infos.at(i); + + m_checkboxes[i]->setText(displayNameFrom(info)); + if (m_shadowBuildEnabled->isChecked()) + m_pathChoosers[i]->setPath(info.directory); + else + m_pathChoosers[i]->setPath(sourceDir); + reportIssues(i); + } + m_ignoreChange = false; + } +} + +void Qt4DefaultTargetSetupWidget::setupImportWidgets() +{ + for (int i = 0; i < m_importInfos.size(); ++i) + createImportWidget(m_importInfos.at(i), i); +} + +void Qt4DefaultTargetSetupWidget::createImportWidget(const BuildConfigurationInfo &info, int pos) +{ + QCheckBox *checkBox = new QCheckBox; + checkBox->setText(tr("Import build from %1").arg(info.directory)); + checkBox->setChecked(m_importEnabled.at(pos)); + m_importLayout->addWidget(checkBox, pos, 0, 1, 2); + + connect(checkBox, SIGNAL(toggled(bool)), + this, SLOT(importCheckBoxToggled(bool))); + + m_importCheckBoxes.append(checkBox); +} + +void Qt4DefaultTargetSetupWidget::setupWidgets() +{ + m_ignoreChange = true; + QString sourceDir = QFileInfo(m_proFilePath).absolutePath(); + for (int i = 0; i < m_infos.size(); ++i) { + const BuildConfigurationInfo &info = m_infos.at(i); + QCheckBox *checkbox = new QCheckBox; + checkbox->setText(displayNameFrom(info)); + checkbox->setChecked(m_enabled.at(i)); + m_newBuildsLayout->addWidget(checkbox, i * 2, 0); + + Utils::PathChooser *pathChooser = new Utils::PathChooser(); + pathChooser->setExpectedKind(Utils::PathChooser::Directory); + if (m_shadowBuildEnabled->isChecked()) + pathChooser->setPath(info.directory); + else + pathChooser->setPath(sourceDir); + pathChooser->setReadOnly(!m_directoriesEnabled); + m_newBuildsLayout->addWidget(pathChooser, i * 2, 1); + + QLabel *reportIssuesLabel = new QLabel; + reportIssuesLabel->setIndent(32); + m_newBuildsLayout->addWidget(reportIssuesLabel, i * 2 + 1, 0, 1, 2); + + connect(checkbox, SIGNAL(toggled(bool)), + this, SLOT(checkBoxToggled(bool))); + + connect(pathChooser, SIGNAL(changed(QString)), + this, SLOT(pathChanged())); + + m_checkboxes.append(checkbox); + m_pathChoosers.append(pathChooser); + m_reportIssuesLabels.append(reportIssuesLabel); + reportIssues(i); + } + m_ignoreChange = false; +} + +void Qt4DefaultTargetSetupWidget::clearWidgets() +{ + qDeleteAll(m_checkboxes); + m_checkboxes.clear(); + qDeleteAll(m_pathChoosers); + m_pathChoosers.clear(); + qDeleteAll(m_reportIssuesLabels); + m_reportIssuesLabels.clear(); +} + +void Qt4DefaultTargetSetupWidget::checkBoxToggled(bool b) +{ + QCheckBox *box = qobject_cast<QCheckBox *>(sender()); + if (!box) + return; + int index = m_checkboxes.indexOf(box); + if (index == -1) + return; + if (m_enabled[index] == b) + return; + m_selected += b ? 1 : -1; + m_enabled[index] = b; + if ((m_selected == 0 && !b) || (m_selected == 1 && b)) + emit selectedToggled(); +} + +void Qt4DefaultTargetSetupWidget::importCheckBoxToggled(bool b) +{ + QCheckBox *box = qobject_cast<QCheckBox *>(sender()); + if (!box) + return; + int index = m_importCheckBoxes.indexOf(box); + if (index == -1) + return; + if (m_importEnabled[index] == b) + return; + m_selected += b ? 1 : -1; + m_importEnabled[index] = b; + if ((m_selected == 0 && !b) || (m_selected == 1 && b)) + emit selectedToggled(); +} + +void Qt4DefaultTargetSetupWidget::pathChanged() +{ + if (m_ignoreChange) + return; + Utils::PathChooser *pathChooser = qobject_cast<Utils::PathChooser *>(sender()); + if (!pathChooser) + return; + int index = m_pathChoosers.indexOf(pathChooser); + if (index == -1) + return; + m_infos[index].directory = pathChooser->path(); + reportIssues(index); +} + +void Qt4DefaultTargetSetupWidget::shadowBuildingToggled() +{ + m_ignoreChange = true; + bool b = m_shadowBuildEnabled->isChecked(); + if (m_directoriesEnabled == b) + return; + m_directoriesEnabled = b; + QString sourceDir = QFileInfo(m_proFilePath).absolutePath(); + for (int i = 0; i < m_pathChoosers.size(); ++i) { + Utils::PathChooser *pathChooser = m_pathChoosers.at(i); + pathChooser->setReadOnly(!b); + if (b) + pathChooser->setPath(m_infos.at(i).directory); + else + pathChooser->setPath(sourceDir); + reportIssues(i); + } + m_ignoreChange = false; +} + +void Qt4DefaultTargetSetupWidget::reportIssues(int index) +{ + QPair<ProjectExplorer::Task::TaskType, QString> issues = findIssues(m_infos.at(index)); + QLabel *reportIssuesLabel = m_reportIssuesLabels.at(index); + reportIssuesLabel->setText(issues.second); + reportIssuesLabel->setVisible(issues.first != ProjectExplorer::Task::Unknown); +} + +QPair<ProjectExplorer::Task::TaskType, QString> Qt4DefaultTargetSetupWidget::findIssues(const BuildConfigurationInfo &info) +{ + if (m_proFilePath.isEmpty()) + return qMakePair(ProjectExplorer::Task::Unknown, QString()); + + QString buildDir = info.directory; + QtVersion *version = info.version; + + QList<ProjectExplorer::Task> issues = version->reportIssues(m_proFilePath, buildDir); + + QString text; + ProjectExplorer::Task::TaskType highestType = ProjectExplorer::Task::Unknown; + foreach (const ProjectExplorer::Task &t, issues) { + if (!text.isEmpty()) + text.append(QLatin1String("<br>")); + // set severity: + QString severity; + if (t.type == ProjectExplorer::Task::Error) { + highestType = ProjectExplorer::Task::Error; + severity = tr("<b>Error:</b> ", "Severity is Task::Error"); + } else if (t.type == ProjectExplorer::Task::Warning) { + if (highestType == ProjectExplorer::Task::Unknown) + highestType = ProjectExplorer::Task::Warning; + severity = tr("<b>Warning:</b> ", "Severity is Task::Warning"); + } + text.append(severity + t.description); + } + if (!text.isEmpty()) + text = QLatin1String("<nobr>") + text; + return qMakePair(highestType, text); +} + +// ----------------------- +// BuildConfigurationInfo +// ----------------------- + +QList<BuildConfigurationInfo> BuildConfigurationInfo::filterBuildConfigurationInfos(const QList<BuildConfigurationInfo> &infos, const QString &id) +{ + QList<BuildConfigurationInfo> result; + foreach (const BuildConfigurationInfo &info, infos) + if (info.version->supportsTargetId(id)) + result.append(info); + return result; +} + +QList<BuildConfigurationInfo> BuildConfigurationInfo::importBuildConfigurations(const QString &proFilePath) +{ + QList<BuildConfigurationInfo> result; + + // Check for in source build first + QString sourceDir = QFileInfo(proFilePath).absolutePath(); + result.append(checkForBuild(sourceDir, proFilePath)); + + // If we found a in source build, we do not search for out of source builds + if (!result.isEmpty()) + return result; + + // Check for builds in build directoy + QList<Qt4BaseTargetFactory *> factories = + ExtensionSystem::PluginManager::instance()->getObjects<Qt4BaseTargetFactory>(); + QString defaultTopLevelBuildDirectory = Qt4Project::defaultTopLevelBuildDirectory(proFilePath); + foreach (Qt4BaseTargetFactory *factory, factories) { + foreach (const QString &id, factory->supportedTargetIds(0)) { + QString expectedBuild = factory->defaultShadowBuildDirectory(defaultTopLevelBuildDirectory, id); + result.append(checkForBuild(expectedBuild, proFilePath)); + } + } + return result; +} + +BuildConfigurationInfo BuildConfigurationInfo::checkForBuild(const QString &directory, const QString &proFilePath) +{ + QString makefile = directory + "/Makefile"; + QString qmakeBinary = QtVersionManager::findQMakeBinaryFromMakefile(makefile); + if (qmakeBinary.isEmpty()) + return BuildConfigurationInfo(); + if (!QtVersionManager::makefileIsFor(makefile, proFilePath)) + return BuildConfigurationInfo(); + + bool temporaryQtVersion = false; + QtVersion *version = QtVersionManager::instance()->qtVersionForQMakeBinary(qmakeBinary); + if (!version) { + version = new QtVersion(qmakeBinary); + temporaryQtVersion = true; + } + + QPair<QtVersion::QmakeBuildConfigs, QString> makefileBuildConfig = + QtVersionManager::scanMakeFile(makefile, version->defaultBuildConfig()); + + QString additionalArguments = makefileBuildConfig.second; + QString parsedSpec = Qt4BuildConfiguration::extractSpecFromArguments(&additionalArguments, directory, version); + QString versionSpec = version->mkspec(); + + QString specArgument; + // Compare mkspecs and add to additional arguments + if (parsedSpec.isEmpty() || parsedSpec == versionSpec || parsedSpec == "default") { + // using the default spec, don't modify additional arguments + } else { + specArgument = "-spec " + Utils::QtcProcess::quoteArg(parsedSpec); + } + Utils::QtcProcess::addArgs(&specArgument, additionalArguments); + + + BuildConfigurationInfo info = BuildConfigurationInfo(version, + makefileBuildConfig.first, + specArgument, + directory, + true, + temporaryQtVersion); + return info; +} diff --git a/src/plugins/qt4projectmanager/qt4target.h b/src/plugins/qt4projectmanager/qt4target.h index 7aa7be7381a9286ea13ee1989bba9b1907e5a787..cfc1e53249eb64af3f4d96b34c9e5f1be9aa3e11 100644 --- a/src/plugins/qt4projectmanager/qt4target.h +++ b/src/plugins/qt4projectmanager/qt4target.h @@ -40,6 +40,19 @@ #include <projectexplorer/target.h> #include <projectexplorer/projectnodes.h> +namespace Utils { +class DetailsWidget; +class PathChooser; +} + +QT_BEGIN_NAMESPACE +class QCheckBox; +class QHBoxLayout; +class QGridLayout; +class QLabel; +class QPushButton; +QT_END_NAMESPACE + namespace Qt4ProjectManager { class Qt4Project; @@ -49,14 +62,31 @@ class Qt4ProFileNode; } struct BuildConfigurationInfo { + explicit BuildConfigurationInfo() + : version(0), buildConfig(QtVersion::QmakeBuildConfig(0)), importing(false), temporaryQtVersion(false) + {} + explicit BuildConfigurationInfo(QtVersion *v, QtVersion::QmakeBuildConfigs bc, - const QString &aa, const QString &d) : - version(v), buildConfig(bc), additionalArguments(aa), directory(d) + const QString &aa, const QString &d, bool importing_ = false, bool temporaryQtVersion_ = false) : + version(v), buildConfig(bc), additionalArguments(aa), directory(d), importing(importing_), temporaryQtVersion(temporaryQtVersion_) { } + + bool isValid() const + { + return version != 0; + } + QtVersion *version; QtVersion::QmakeBuildConfigs buildConfig; QString additionalArguments; QString directory; + bool importing; + bool temporaryQtVersion; + + + static QList<BuildConfigurationInfo> importBuildConfigurations(const QString &proFilePath); + static BuildConfigurationInfo checkForBuild(const QString &directory, const QString &proFilePath); + static QList<BuildConfigurationInfo> filterBuildConfigurationInfos(const QList<BuildConfigurationInfo> &infos, const QString &id); }; class Qt4BaseTarget : public ProjectExplorer::Target @@ -101,6 +131,21 @@ private slots: void emitProFileEvaluateNeeded(); }; +class QT4PROJECTMANAGER_EXPORT Qt4TargetSetupWidget : public QWidget +{ + Q_OBJECT +public: + Qt4TargetSetupWidget(); + ~Qt4TargetSetupWidget(); + virtual bool isTargetSelected() const = 0; + virtual void setTargetSelected(bool b) = 0; + virtual void setProFilePath(const QString &proFilePath) = 0; + virtual QList<BuildConfigurationInfo> usedImportInfos() = 0; +signals: + void selectedToggled() const; + void newImportBuildConfiguration(const BuildConfigurationInfo &info); +}; + class QT4PROJECTMANAGER_EXPORT Qt4BaseTargetFactory : public ProjectExplorer::ITargetFactory { Q_OBJECT @@ -108,23 +153,101 @@ public: Qt4BaseTargetFactory(QObject *parent); ~Qt4BaseTargetFactory(); - virtual QString defaultShadowBuildDirectory(const QString &projectLocation, const QString &id) =0; - virtual QList<BuildConfigurationInfo> availableBuildConfigurations(const QString &proFilePath) = 0; - - virtual Qt4BaseTarget *create(ProjectExplorer::Project *parent, const QString &id) = 0; - virtual Qt4BaseTarget *create(ProjectExplorer::Project *parent, - const QString &id, - QList<BuildConfigurationInfo> infos) = 0; + virtual Qt4TargetSetupWidget *createTargetSetupWidget(const QString &id, + const QString &proFilePath, + const QtVersionNumber &minimumQtVersion, + bool importEnabled, + QList<BuildConfigurationInfo> importInfos); + virtual QString defaultShadowBuildDirectory(const QString &projectLocation, const QString &id) =0; + /// used by the default implementation of createTargetSetupWidget + /// not needed otherwise + virtual QList<BuildConfigurationInfo> availableBuildConfigurations(const QString &id, const QString &proFilePath, const QtVersionNumber &minimumQtVersion) = 0; /// only used in the TargetSetupPage virtual QIcon iconForId(const QString &id) const = 0; + virtual bool isMobileTarget(const QString &id) = 0; + + virtual Qt4BaseTarget *create(ProjectExplorer::Project *parent, const QString &id) = 0; + virtual Qt4BaseTarget *create(ProjectExplorer::Project *parent, const QString &id, const QList<BuildConfigurationInfo> &infos) = 0; + virtual Qt4BaseTarget *create(ProjectExplorer::Project *parent, const QString &id, Qt4TargetSetupWidget *widget); + static Qt4BaseTargetFactory *qt4BaseTargetFactoryForId(const QString &id); protected: static QString msgBuildConfigurationName(const BuildConfigurationInfo &info); }; +class Qt4DefaultTargetSetupWidget : public Qt4TargetSetupWidget +{ + Q_OBJECT +public: + Qt4DefaultTargetSetupWidget(Qt4BaseTargetFactory *factory, + const QString &id, + const QString &proFilePath, + const QtVersionNumber &minimumQtVersion, + bool importEnabled, + QList<BuildConfigurationInfo> importInfos); + ~Qt4DefaultTargetSetupWidget(); + bool isTargetSelected() const; + void setTargetSelected(bool b); + QList<BuildConfigurationInfo> usedImportInfos(); + + QList<BuildConfigurationInfo> buildConfigurationInfos() const; + void setProFilePath(const QString &proFilePath); + + void setShadowBuildCheckBoxVisible(bool b); + +public slots: + void addImportClicked(); + void checkBoxToggled(bool b); + void importCheckBoxToggled(bool b); + void pathChanged(); + void shadowBuildingToggled(); + +private: + void setBuildConfigurationInfos(const QList<BuildConfigurationInfo> &list, bool resetEnabled = true); + void reportIssues(int index); + QPair<ProjectExplorer::Task::TaskType, QString> findIssues(const BuildConfigurationInfo &info); + void createImportWidget(const BuildConfigurationInfo &info, int pos); + + QString m_id; + Qt4BaseTargetFactory *m_factory; + QString m_proFilePath; + QtVersionNumber m_minimumQtVersion; + Utils::DetailsWidget *m_detailsWidget; + QGridLayout *m_importLayout; + QGridLayout *m_newBuildsLayout; + QCheckBox *m_shadowBuildEnabled; + QWidget *m_spacerTopWidget; + QWidget *m_spacerBottomWidget; + + // import line widgets + QHBoxLayout *m_importLineLayout; + QLabel *m_importLineLabel; + Utils::PathChooser *m_importLinePath; + QPushButton *m_importLineButton; + + void setupWidgets(); + void clearWidgets(); + void setupImportWidgets(); + QString displayNameFrom(const BuildConfigurationInfo &info); + QList<QCheckBox *> m_checkboxes; + QList<Utils::PathChooser *> m_pathChoosers; + QList<BuildConfigurationInfo> m_infos; + QList<bool> m_enabled; + QList<QCheckBox *> m_importCheckBoxes; + QList<BuildConfigurationInfo> m_importInfos; + QList<bool> m_importEnabled; + QList<QLabel *> m_reportIssuesLabels; + bool m_directoriesEnabled; + bool m_hasInSourceBuild; + bool m_ignoreChange; + bool m_showImport; + int m_selected; + +}; + } // namespace Qt4ProjectManager #endif // QT4TARGET_H diff --git a/src/plugins/qt4projectmanager/qtversionmanager.cpp b/src/plugins/qt4projectmanager/qtversionmanager.cpp index 8132e2502f76f1eaeefe42debd24c7ccda43d10b..8cbe5961af3c4f4415e538c84a6c7b8ad4dc72d9 100644 --- a/src/plugins/qt4projectmanager/qtversionmanager.cpp +++ b/src/plugins/qt4projectmanager/qtversionmanager.cpp @@ -1377,16 +1377,6 @@ QSet<QString> QtVersion::supportedTargetIds() const return m_targetIds; } -bool QtVersion::supportsMobileTarget() const -{ - return supportsTargetId(Constants::S60_DEVICE_TARGET_ID) || - supportsTargetId(Constants::S60_EMULATOR_TARGET_ID) || - supportsTargetId(Constants::MAEMO5_DEVICE_TARGET_ID) || - supportsTargetId(Constants::HARMATTAN_DEVICE_TARGET_ID) || - supportsTargetId(Constants::MEEGO_DEVICE_TARGET_ID) || - supportsTargetId(Constants::QT_SIMULATOR_TARGET_ID); -} - QList<ProjectExplorer::Abi> QtVersion::qtAbis() const { updateAbiAndMkspec(); diff --git a/src/plugins/qt4projectmanager/qtversionmanager.h b/src/plugins/qt4projectmanager/qtversionmanager.h index f8ca79ccf4e37f042b0d9c7b1128ad3224df923f..aa6f896370c8be1919fe47cb7542616bfe860084 100644 --- a/src/plugins/qt4projectmanager/qtversionmanager.h +++ b/src/plugins/qt4projectmanager/qtversionmanager.h @@ -110,7 +110,6 @@ public: bool supportsTargetId(const QString &id) const; QSet<QString> supportedTargetIds() const; - bool supportsMobileTarget() const; QList<ProjectExplorer::Abi> qtAbis() const; diff --git a/src/plugins/qt4projectmanager/wizards/abstractmobileappwizard.cpp b/src/plugins/qt4projectmanager/wizards/abstractmobileappwizard.cpp index 1ccb3c063cd07642d4aff4ba4467a4f9ab7f3490..4cb1a3c8463975a376b8a746c7ebe0d9bcbe8fc7 100644 --- a/src/plugins/qt4projectmanager/wizards/abstractmobileappwizard.cpp +++ b/src/plugins/qt4projectmanager/wizards/abstractmobileappwizard.cpp @@ -54,8 +54,9 @@ AbstractMobileAppWizardDialog::AbstractMobileAppWizardDialog(QWidget *parent) : ProjectExplorer::BaseProjectWizardDialog(parent) { m_targetsPage = new TargetSetupPage; + m_targetsPage->setPreferMobile(true); + m_targetsPage->setMinimumQtVersion(QtVersionNumber(4,7,0)); resize(900, 450); - m_targetsPage->setImportDirectoryBrowsingEnabled(false); m_targetsPageId = addPageWithTitle(m_targetsPage, tr("Qt Versions")); m_genericOptionsPage = new MobileAppWizardGenericOptionsPage; m_genericOptionsPageId = addPageWithTitle(m_genericOptionsPage, diff --git a/src/plugins/qt4projectmanager/wizards/html5appwizard.cpp b/src/plugins/qt4projectmanager/wizards/html5appwizard.cpp index 2afece5bc498bf8e3fb7b20891ce2b355880f804..495203083fcf6c639efaf4e0664224a4beea74ca 100644 --- a/src/plugins/qt4projectmanager/wizards/html5appwizard.cpp +++ b/src/plugins/qt4projectmanager/wizards/html5appwizard.cpp @@ -117,7 +117,7 @@ AbstractMobileAppWizardDialog *Html5AppWizard::createWizardDialogInternal(QWidge void Html5AppWizard::projectPathChanged(const QString &path) const { - m_d->wizardDialog->m_targetsPage->setImportInfos(TargetSetupPage::importInfosForKnownQtVersions(path)); + m_d->wizardDialog->m_targetsPage->setProFilePath(path); } void Html5AppWizard::prepareGenerateFiles(const QWizard *w, diff --git a/src/plugins/qt4projectmanager/wizards/mobileappwizard.cpp b/src/plugins/qt4projectmanager/wizards/mobileappwizard.cpp index ac6407e1beda57330e0cb2ab317ae38afa40e492..3bbb12e2fcca9a70ab747330d87e5d082d199464 100644 --- a/src/plugins/qt4projectmanager/wizards/mobileappwizard.cpp +++ b/src/plugins/qt4projectmanager/wizards/mobileappwizard.cpp @@ -109,7 +109,7 @@ AbstractMobileAppWizardDialog *MobileAppWizard::createWizardDialogInternal(QWidg void MobileAppWizard::projectPathChanged(const QString &path) const { - m_d->wizardDialog->m_targetsPage->setImportInfos(TargetSetupPage::importInfosForKnownQtVersions(path)); + m_d->wizardDialog->m_targetsPage->setProFilePath(path); } void MobileAppWizard::prepareGenerateFiles(const QWizard *w, diff --git a/src/plugins/qt4projectmanager/wizards/qtquickappwizard.cpp b/src/plugins/qt4projectmanager/wizards/qtquickappwizard.cpp index b3b5f31df48b26b85e60743711bfc9abae6eb0a6..04204fccf2f6c44b0b02337d95704efcd48be38e 100644 --- a/src/plugins/qt4projectmanager/wizards/qtquickappwizard.cpp +++ b/src/plugins/qt4projectmanager/wizards/qtquickappwizard.cpp @@ -117,21 +117,7 @@ AbstractMobileAppWizardDialog *QtQuickAppWizard::createWizardDialogInternal(QWid void QtQuickAppWizard::projectPathChanged(const QString &path) const { - const QList<TargetSetupPage::ImportInfo> &qtVersions - = TargetSetupPage::importInfosForKnownQtVersions(path); - QList<TargetSetupPage::ImportInfo> qmlQtVersions; - foreach (const TargetSetupPage::ImportInfo &qtVersion, qtVersions) { - const QString versionString = qtVersion.version->qtVersionString(); - bool isNumber; - const int majorVersion = versionString.mid(0, 1).toInt(&isNumber); - if (!isNumber || majorVersion < 4) - continue; - const int minorVersion = versionString.mid(2, 1).toInt(&isNumber); - if (!isNumber || (majorVersion == 4 && minorVersion < 7)) - continue; - qmlQtVersions << qtVersion; - } - m_d->wizardDialog->m_targetsPage->setImportInfos(qmlQtVersions); + m_d->wizardDialog->m_targetsPage->setProFilePath(path); } void QtQuickAppWizard::prepareGenerateFiles(const QWizard *w, diff --git a/src/plugins/qt4projectmanager/wizards/qtwizard.cpp b/src/plugins/qt4projectmanager/wizards/qtwizard.cpp index dc7a3a53f066d63c3d7b7ea1f784800171ce194e..9f2815572e218732e0506c8f731998b3575c815d 100644 --- a/src/plugins/qt4projectmanager/wizards/qtwizard.cpp +++ b/src/plugins/qt4projectmanager/wizards/qtwizard.cpp @@ -240,25 +240,13 @@ int BaseQt4ProjectWizardDialog::addTargetSetupPage(QSet<QString> targets, bool m m_targets = targets; resize(900, 450); - connect(this, SIGNAL(projectLocationChanged(QString)), - m_targetSetupPage, SLOT(setProFilePath(QString))); - - QList<TargetSetupPage::ImportInfo> infos = TargetSetupPage::importInfosForKnownQtVersions(path()); - if (!targets.isEmpty()) - infos = TargetSetupPage::filterImportInfos(targets, infos); - m_targetSetupPage->setImportDirectoryBrowsingEnabled(false); m_targetSetupPage->setPreferMobile(mobile); - if (infos.count() <= 1) - return -1; - - m_targetSetupPage->setImportInfos(infos); - if (id >= 0) setPage(id, m_targetSetupPage); else id = addPage(m_targetSetupPage); - wizardProgress()->item(id)->setTitle(tr("Qt Versions")); + wizardProgress()->item(id)->setTitle(tr("Targets")); return id; } @@ -324,11 +312,7 @@ bool BaseQt4ProjectWizardDialog::isTargetSelected(const QString &targetid) const void BaseQt4ProjectWizardDialog::generateProfileName(const QString &name, const QString &path) { const QString proFile = QDir::fromNativeSeparators(path) + QChar('/') + name + QChar('/') + name + QLatin1String(".pro"); - QList<TargetSetupPage::ImportInfo> infos = TargetSetupPage::importInfosForKnownQtVersions(proFile); - if (!m_targets.isEmpty()) - infos = TargetSetupPage::filterImportInfos(m_targets, infos); - m_targetSetupPage->setImportInfos(infos); - emit projectLocationChanged(proFile); + m_targetSetupPage->setProFilePath(proFile); } QSet<QString> BaseQt4ProjectWizardDialog::desktopTarget() diff --git a/src/plugins/qt4projectmanager/wizards/qtwizard.h b/src/plugins/qt4projectmanager/wizards/qtwizard.h index a0a507bee2e2718c6f9febbab872a82b88d648dd..0177b02b6b995a6c0bed6a92d76b1bd5dd59be51 100644 --- a/src/plugins/qt4projectmanager/wizards/qtwizard.h +++ b/src/plugins/qt4projectmanager/wizards/qtwizard.h @@ -146,9 +146,6 @@ public: bool setupProject(Qt4Project *project) const; bool isTargetSelected(const QString &targetid) const; -signals: - void projectLocationChanged(const QString &proFileName); - private slots: void generateProfileName(const QString &name, const QString &path); diff --git a/src/plugins/qt4projectmanager/wizards/targetsetuppage.cpp b/src/plugins/qt4projectmanager/wizards/targetsetuppage.cpp index 5bd3daa712131f5ac267939fff3d770fd3ce560b..9d8b05ac4c349764138c2455c6c8c5562ddd7ea8 100644 --- a/src/plugins/qt4projectmanager/wizards/targetsetuppage.cpp +++ b/src/plugins/qt4projectmanager/wizards/targetsetuppage.cpp @@ -46,245 +46,163 @@ #include <utils/qtcassert.h> #include <utils/qtcprocess.h> -#include <QtGui/QAction> -#include <QtGui/QFileDialog> -#include <QtGui/QHeaderView> #include <QtGui/QLabel> #include <QtGui/QLayout> -#include <QtGui/QMenu> -#include <QtGui/QMessageBox> -#include <QtGui/QPushButton> -#include <QtGui/QTreeWidget> using namespace Qt4ProjectManager; using namespace Qt4ProjectManager::Internal; -namespace { -enum Columns { - NAME_COLUMN = 0, - STATUS_COLUMN, - DIRECTORY_COLUMN -}; -} // namespace - TargetSetupPage::TargetSetupPage(QWidget *parent) : QWizardPage(parent), m_preferMobile(false), - m_toggleWillCheck(false), - m_ui(new Ui::TargetSetupPage), - m_contextMenu(0) + m_importSearch(false), + m_spacer(new QSpacerItem(0, 0, QSizePolicy::Minimum, QSizePolicy::Expanding)), + m_ui(new Ui::TargetSetupPage) { m_ui->setupUi(this); - m_ui->versionTree->header()->setResizeMode(0, QHeaderView::ResizeToContents); - m_ui->versionTree->header()->setResizeMode(1, QHeaderView::ResizeToContents); - - m_ui->versionTree->setContextMenuPolicy(Qt::CustomContextMenu); - m_contextMenu = new QMenu(this); - - connect(m_ui->importButton, SIGNAL(clicked()), - this, SLOT(addShadowBuildLocation())); - connect(m_ui->uncheckButton, SIGNAL(clicked()), - this, SLOT(checkAllButtonClicked())); - connect(m_ui->versionTree, SIGNAL(customContextMenuRequested(QPoint)), - this, SLOT(contextMenuRequested(QPoint))); + QWidget *centralWidget = new QWidget(this); + m_ui->scrollArea->setWidget(centralWidget); + m_layout = new QVBoxLayout; + centralWidget->setLayout(m_layout); + m_layout->addSpacerItem(m_spacer); - setTitle(tr("Qt Versions")); + setTitle(tr("Target setup")); } void TargetSetupPage::initializePage() { - // WORKAROUND: Somebody sets all buttons to autoDefault between the ctor and here! - m_ui->importButton->setAutoDefault(false); - m_ui->uncheckButton->setAutoDefault(false); + cleanupImportInfos(); + deleteWidgets(); + + setupImportInfos(); + setupWidgets(); } TargetSetupPage::~TargetSetupPage() { - resetInfos(); + deleteWidgets(); delete m_ui; + cleanupImportInfos(); } -void TargetSetupPage::setImportInfos(const QList<ImportInfo> &infos) +bool TargetSetupPage::isTargetSelected(const QString &id) const { - disconnect(m_ui->versionTree, SIGNAL(itemChanged(QTreeWidgetItem*,int)), - this, SLOT(itemWasChanged())); - - // Create a list of all temporary Qt versions we need to delete in our existing list - QList<QtVersion *> toDelete; - foreach (const ImportInfo &info, m_infos) { - if (info.isTemporary) - toDelete.append(info.version); - } - // Remove those that got copied into the new list to set up - foreach (const ImportInfo &info, infos) { - if (info.isTemporary) - toDelete.removeAll(info.version); - } - // Delete the rest - qDeleteAll(toDelete); - // ... and clear the list - m_infos.clear(); - - // Find possible targets: - QStringList targetIds; - foreach (const ImportInfo &i, infos) { - // Make sure we have no duplicate directories: - bool skip = false; - foreach (const ImportInfo &j, m_infos) { - if (j.isExistingBuild && i.isExistingBuild && (j.directory == i.directory)) { - skip = true; - break; - } - } - if (skip) { - if (i.isTemporary) - delete i.version; - continue; - } + Qt4TargetSetupWidget *widget = m_widgets.value(id); + return widget && widget->isTargetSelected(); +} - m_infos.append(i); +bool TargetSetupPage::isComplete() const +{ + foreach (Qt4TargetSetupWidget *widget, m_widgets) + if (widget->isTargetSelected()) + return true; + return false; +} - QSet<QString> versionTargets = i.version->supportedTargetIds(); - foreach (const QString &t, versionTargets) { - if (!targetIds.contains(t)) - targetIds.append(t); - } - } - qSort(targetIds.begin(), targetIds.end()); +void TargetSetupPage::setPreferMobile(bool mobile) +{ + m_preferMobile = mobile; +} - m_ui->versionTree->clear(); +void TargetSetupPage::setMinimumQtVersion(const QtVersionNumber &number) +{ + m_minimumQtVersionNumber = number; +} - foreach (const QString &targetId, targetIds) { - QTreeWidgetItem *targetItem = new QTreeWidgetItem(m_ui->versionTree); +void TargetSetupPage::setImportSearch(bool b) +{ + m_importSearch = b; +} - Qt4BaseTargetFactory *factory = 0; - QList<Qt4BaseTargetFactory *> factories = - ExtensionSystem::PluginManager::instance()->getObjects<Qt4BaseTargetFactory>(); - foreach (Qt4BaseTargetFactory *fac, factories) { - if (fac->supportsTargetId(targetId)) { - factory = fac; - break; +void TargetSetupPage::setupWidgets() +{ + QList<Qt4BaseTargetFactory *> factories = ExtensionSystem::PluginManager::instance()->getObjects<Qt4BaseTargetFactory>(); + foreach (Qt4BaseTargetFactory *factory, factories) { + QStringList ids = factory->supportedTargetIds(0); + foreach (const QString &id, ids) { + QList<BuildConfigurationInfo> infos = BuildConfigurationInfo::filterBuildConfigurationInfos(m_importInfos, id); + Qt4TargetSetupWidget *widget = + factory->createTargetSetupWidget(id, m_proFilePath, m_minimumQtVersionNumber, m_importSearch, infos); + if (widget) { + widget->setTargetSelected( (m_preferMobile == factory->isMobileTarget(id) && m_importInfos.isEmpty()) + || !infos.isEmpty()); + m_widgets.insert(id, widget); + m_factories.insert(widget, factory); + m_layout->addWidget(widget); + connect(widget, SIGNAL(selectedToggled()), + this, SIGNAL(completeChanged())); + connect(widget, SIGNAL(newImportBuildConfiguration(BuildConfigurationInfo)), + this, SLOT(newImportBuildConfiguration(BuildConfigurationInfo))); } } - if (!factory) - continue; - - QString displayName = factory->displayNameForId(targetId); - - targetItem->setText(0, displayName); - targetItem->setToolTip(0, displayName); - targetItem->setFlags(Qt::ItemIsEnabled | Qt::ItemIsSelectable); - targetItem->setData(NAME_COLUMN, Qt::UserRole, targetId); - targetItem->setExpanded(true); - - int pos = -1; - foreach (const ImportInfo &i, m_infos) { - ++pos; - - if (!i.version->supportsTargetId(targetId)) - continue; - QTreeWidgetItem *versionItem = new QTreeWidgetItem(targetItem); - updateVersionItem(versionItem, pos); + } + m_layout->addSpacerItem(m_spacer); +} - // Prefer imports to creating new builds, but precheck any - // Qt that exists (if there is no import with that version) - bool shouldCheck = true; - if (!i.isExistingBuild) { - foreach (const ImportInfo &j, m_infos) { - if (j.isExistingBuild && j.version == i.version) { - shouldCheck = false; - break; - } - } - } +void TargetSetupPage::deleteWidgets() +{ + foreach (Qt4TargetSetupWidget *widget, m_widgets) + delete widget; + m_widgets.clear(); + m_factories.clear(); + m_layout->removeItem(m_spacer); +} - shouldCheck = shouldCheck && (m_preferMobile == i.version->supportsMobileTarget()); - shouldCheck = shouldCheck || i.isExistingBuild; // always check imports - shouldCheck = shouldCheck || m_infos.count() == 1; // always check only option - versionItem->setCheckState(NAME_COLUMN, shouldCheck ? Qt::Checked : Qt::Unchecked); - } +void TargetSetupPage::setProFilePath(const QString &path) +{ + m_proFilePath = path; + if (!m_proFilePath.isEmpty()) { + m_ui->descriptionLabel->setText(tr("Qt Creator can set up the following targets for project <b>%1</b>:", + "%1: Project name").arg(QFileInfo(m_proFilePath).baseName())); } - connect(m_ui->versionTree, SIGNAL(itemChanged(QTreeWidgetItem*,int)), - this, SLOT(itemWasChanged())); - - emit completeChanged(); + deleteWidgets(); + setupWidgets(); } -QList<TargetSetupPage::ImportInfo> TargetSetupPage::importInfos() const +void TargetSetupPage::setupImportInfos() { - return m_infos; + if (m_importSearch) + m_importInfos = BuildConfigurationInfo::importBuildConfigurations(m_proFilePath); } -bool TargetSetupPage::hasSelection() const +void TargetSetupPage::cleanupImportInfos() { - for (int i = 0; i < m_ui->versionTree->topLevelItemCount(); ++i) { - QTreeWidgetItem * current = m_ui->versionTree->topLevelItem(i); - for (int j = 0; j < current->childCount(); ++j) { - QTreeWidgetItem * child = current->child(j); - if (child->checkState(NAME_COLUMN) == Qt::Checked) - return true; - } + foreach (const BuildConfigurationInfo &info, m_importInfos) { + if (info.temporaryQtVersion) + delete info.version; } - return false; } -bool TargetSetupPage::isTargetSelected(const QString &targetid) const +void TargetSetupPage::newImportBuildConfiguration(const BuildConfigurationInfo &info) { - for (int i = 0; i < m_ui->versionTree->topLevelItemCount(); ++i) { - QTreeWidgetItem * current = m_ui->versionTree->topLevelItem(i); - if (current->data(NAME_COLUMN, Qt::UserRole).toString() != targetid) - continue; - for (int j = 0; j < current->childCount(); ++j) { - QTreeWidgetItem * child = current->child(j); - if (child->checkState(NAME_COLUMN) == Qt::Checked) - return true; - } - } - return false; + m_importInfos.append(info); } bool TargetSetupPage::setupProject(Qt4ProjectManager::Qt4Project *project) { - Q_ASSERT(project->targets().isEmpty()); - QtVersionManager *vm = QtVersionManager::instance(); - for (int i = 0; i < m_ui->versionTree->topLevelItemCount(); ++i) { - QTreeWidgetItem *current = m_ui->versionTree->topLevelItem(i); - QString targetId = current->data(NAME_COLUMN, Qt::UserRole).toString(); - - Qt4BaseTargetFactory *qt4TargetFactory = Qt4BaseTargetFactory::qt4BaseTargetFactoryForId(targetId); - if (qt4TargetFactory && qt4TargetFactory->canCreate(project, targetId)) { - QList<BuildConfigurationInfo> targetInfos; - for (int j = 0; j < current->childCount(); ++j) { - QTreeWidgetItem *child = current->child(j); - if (child->checkState(0) != Qt::Checked) - continue; - ImportInfo &info = m_infos[child->data(0, Qt::UserRole).toInt()]; - - // Register temporary Qt version - if (info.isTemporary) { - vm->addVersion(info.version); - info.isTemporary = false; + QMap<QString, Qt4TargetSetupWidget *>::const_iterator it, end; + end = m_widgets.constEnd(); + it = m_widgets.constBegin(); + for ( ; it != end; ++it) { + Qt4BaseTargetFactory *factory = m_factories.value(it.value()); + + foreach (const BuildConfigurationInfo &info, it.value()->usedImportInfos()) { + QtVersion *version = info.version; + for (int i=0; i < m_importInfos.size(); ++i) { + if (m_importInfos.at(i).version == version) { + if (m_importInfos[i].temporaryQtVersion) { + QtVersionManager::instance()->addVersion(m_importInfos[i].version); + m_importInfos[i].temporaryQtVersion = false; + } } - - targetInfos.append(BuildConfigurationInfo(info.version, info.buildConfig, - info.additionalArguments, info.directory)); - } - - // create the target: - Qt4BaseTarget *target = 0; - if (!targetInfos.isEmpty()) { - target = qt4TargetFactory->create(project, targetId, targetInfos); - } - - if (target) { - project->addTarget(target); - if (target->id() == QLatin1String(Constants::QT_SIMULATOR_TARGET_ID)) - project->setActiveTarget(target); } } - } + Qt4BaseTarget *target = factory->create(project, it.key(), it.value()); + if (target) + project->addTarget(target); + } // Create a desktop target if nothing else was set up: if (project->targets().isEmpty()) { @@ -315,346 +233,3 @@ bool TargetSetupPage::setupProject(Qt4ProjectManager::Qt4Project *project) return !project->targets().isEmpty(); } - -void TargetSetupPage::itemWasChanged() -{ - emit completeChanged(); -} - -bool TargetSetupPage::isComplete() const -{ - return hasSelection(); -} - -void TargetSetupPage::setImportDirectoryBrowsingEnabled(bool browsing) -{ - m_ui->importButton->setEnabled(browsing); - m_ui->importButton->setVisible(browsing); -} - -void TargetSetupPage::setImportDirectoryBrowsingLocation(const QString &directory) -{ - m_defaultShadowBuildLocation = directory; -} - -void TargetSetupPage::setPreferMobile(bool mobile) -{ - m_preferMobile = mobile; -} - -void TargetSetupPage::setProFilePath(const QString &path) -{ - m_proFilePath = path; - if (!m_proFilePath.isEmpty()) { - m_ui->descriptionLabel->setText(tr("Qt Creator can set up the following targets for<br>project <b>%1</b>:", - "%1: Project name").arg(QFileInfo(m_proFilePath).baseName())); - } - // Force regeneration of tree widget contents: - QList<ImportInfo> tmp = m_infos; - setImportInfos(tmp); -} - -QList<TargetSetupPage::ImportInfo> TargetSetupPage::importInfosForKnownQtVersions(const QString &proFilePath) -{ - QList<Qt4BaseTargetFactory *> factories = - ExtensionSystem::PluginManager::instance()->getObjects<Qt4BaseTargetFactory>(); - - QList<BuildConfigurationInfo> bcinfos; - - foreach (Qt4BaseTargetFactory *fac, factories) - bcinfos.append(fac->availableBuildConfigurations(proFilePath)); - - QList<ImportInfo> infos; - foreach (const BuildConfigurationInfo &info, bcinfos) { - infos.append(ImportInfo(info)); - } - - if (infos.isEmpty()) { - // Fallback to the Qt in Path version - ImportInfo info; - info.isExistingBuild = false; - info.isTemporary = false; - info.version = QtVersionManager::instance()->versions().at(0); - info.buildConfig = info.version->defaultBuildConfig(); - infos.append(info); - } - return infos; -} - -QList<TargetSetupPage::ImportInfo> TargetSetupPage::filterImportInfos(const QSet<QString> &validTargets, - const QList<ImportInfo> &infos) -{ - QList<ImportInfo> results; - foreach (const ImportInfo &info, infos) { - Q_ASSERT(info.version); - foreach (const QString &target, validTargets) { - if (info.version->supportsTargetId(target)) - results.append(info); - } - } - return results; -} - -QList<TargetSetupPage::ImportInfo> -TargetSetupPage::scanDefaultProjectDirectories(Qt4ProjectManager::Qt4Project *project) -{ - // Source directory: - QList<ImportInfo> importVersions = TargetSetupPage::recursivelyCheckDirectoryForBuild(project->projectDirectory(), - project->file()->fileName()); - QtVersionManager *vm = QtVersionManager::instance(); - foreach(const QString &id, vm->supportedTargetIds()) { - Qt4BaseTargetFactory *qt4Factory = Qt4BaseTargetFactory::qt4BaseTargetFactoryForId(id); - QString location = qt4Factory->defaultShadowBuildDirectory(project->defaultTopLevelBuildDirectory(), id); - importVersions.append(TargetSetupPage::recursivelyCheckDirectoryForBuild(location, - project->file()->fileName())); - } - return importVersions; -} - -QList<TargetSetupPage::ImportInfo> -TargetSetupPage::recursivelyCheckDirectoryForBuild(const QString &directory, const QString &proFile, int maxdepth) -{ - QList<ImportInfo> results; - - if (maxdepth <= 0 || directory.isEmpty()) - return results; - - // Check for in-source builds first: - QString qmakeBinary = QtVersionManager::findQMakeBinaryFromMakefile(directory + "/Makefile"); - QDir dir(directory); - - // Recurse into subdirectories: - if (qmakeBinary.isNull() || !QtVersionManager::makefileIsFor(directory + "/Makefile", proFile)) { - QStringList subDirs = dir.entryList(QDir::Dirs | QDir::NoDotAndDotDot); - foreach (QString subDir, subDirs) - results.append(recursivelyCheckDirectoryForBuild(dir.absoluteFilePath(subDir), - proFile, maxdepth - 1)); - return results; - } - - // Shiny fresh directory with a Makefile... - QtVersionManager * vm = QtVersionManager::instance(); - TargetSetupPage::ImportInfo info; - info.directory = dir.absolutePath(); - - // This also means we have a build in there - // First get the qt version - info.version = vm->qtVersionForQMakeBinary(qmakeBinary); - info.isExistingBuild = true; - - // Okay does not yet exist, create - if (!info.version) { - info.version = new QtVersion(qmakeBinary); - info.isTemporary = true; - } - - QPair<QtVersion::QmakeBuildConfigs, QString> result = - QtVersionManager::scanMakeFile(directory + "/Makefile", info.version->defaultBuildConfig()); - info.buildConfig = result.first; - QString aa = result.second; - QString parsedSpec = Qt4BuildConfiguration::extractSpecFromArguments(&aa, directory, info.version); - QString versionSpec = info.version->mkspec(); - - // Compare mkspecs and add to additional arguments - if (parsedSpec.isEmpty() || parsedSpec == versionSpec || parsedSpec == "default") { - // using the default spec, don't modify additional arguments - } else { - info.additionalArguments = "-spec " + Utils::QtcProcess::quoteArg(parsedSpec); - } - Utils::QtcProcess::addArgs(&info.additionalArguments, aa); - - results.append(info); - return results; -} - -void TargetSetupPage::addShadowBuildLocation() -{ - QString newPath = - QFileDialog::getExistingDirectory(this, - tr("Choose a directory to scan for additional shadow builds"), - m_defaultShadowBuildLocation); - - if (newPath.isEmpty()) - return; - - QFileInfo dir(QDir::fromNativeSeparators(newPath)); - if (!dir.exists() || !dir.isDir()) - return; - - QList<ImportInfo> tmp; - tmp.append(recursivelyCheckDirectoryForBuild(dir.absoluteFilePath(), m_proFilePath)); - if (tmp.isEmpty()) { - QMessageBox::warning(this, tr("No builds found"), - tr("No builds for project file \"%1\" were found in the folder \"%2\".", - "%1: pro-file, %2: directory that was checked."). - arg(m_proFilePath, dir.absoluteFilePath())); - return; - } - tmp.append(m_infos); - setImportInfos(tmp); -} - -void TargetSetupPage::checkAll(bool checked) -{ - for (int i = 0; i < m_ui->versionTree->topLevelItemCount(); ++i) { - QTreeWidgetItem *current = m_ui->versionTree->topLevelItem(i); - for (int j = 0; j < current->childCount(); ++j) - checkOne(checked, current->child(j)); - } -} - -void TargetSetupPage::checkOne(bool checked, QTreeWidgetItem *item) -{ - Q_ASSERT(item->parent()); // we are a version item - item->setCheckState(0, checked ? Qt::Checked : Qt::Unchecked); -} - -void TargetSetupPage::checkAllButtonClicked() -{ - checkAll(m_toggleWillCheck); - - m_toggleWillCheck = !m_toggleWillCheck; - m_ui->uncheckButton->setText(m_toggleWillCheck ? tr("Check All") : tr("Uncheck All")); - m_ui->uncheckButton->setToolTip(m_toggleWillCheck - ? tr("Check all Qt versions") : tr("Uncheck all Qt versions")); -} - -void TargetSetupPage::checkAllTriggered() -{ - m_toggleWillCheck = true; - checkAllButtonClicked(); -} - -void TargetSetupPage::uncheckAllTriggered() -{ - m_toggleWillCheck = false; - checkAllButtonClicked(); -} - -void TargetSetupPage::checkOneTriggered() -{ - QAction * action = qobject_cast<QAction *>(sender()); - if (!action) - return; - QTreeWidgetItem *item = static_cast<QTreeWidgetItem *>(action->data().value<void *>()); - if (!item || !item->parent()) - return; - - checkAll(false); - checkOne(true, item); -} - -void TargetSetupPage::contextMenuRequested(const QPoint &position) -{ - m_contextMenu->clear(); - - QTreeWidgetItem *item = m_ui->versionTree->itemAt(position); - m_contextMenu = new QMenu(this); - if (item && item->parent()) { - // Qt version item - QAction *onlyThisAction = new QAction(tr("Check only this version"), m_contextMenu); - connect(onlyThisAction, SIGNAL(triggered()), this, SLOT(checkOneTriggered())); - onlyThisAction->setData(QVariant::fromValue(static_cast<void *>(item))); - m_contextMenu->addAction(onlyThisAction); - - QAction *checkAllAction = new QAction(tr("Check all versions"), m_contextMenu); - connect(checkAllAction, SIGNAL(triggered()), this, SLOT(checkAllTriggered())); - m_contextMenu->addAction(checkAllAction); - - QAction *uncheckAllAction = new QAction(tr("Uncheck all versions"), m_contextMenu); - connect(uncheckAllAction, SIGNAL(triggered()), this, SLOT(uncheckAllTriggered())); - m_contextMenu->addAction(uncheckAllAction); - } - if (!m_contextMenu->isEmpty()) - m_contextMenu->popup(m_ui->versionTree->mapToGlobal(position)); -} - -void TargetSetupPage::resetInfos() -{ - m_ui->versionTree->clear(); - foreach (const ImportInfo &info, m_infos) { - if (info.isTemporary) - delete info.version; - } - m_infos.clear(); -} - -QPair<QIcon, QString> TargetSetupPage::reportIssues(Qt4ProjectManager::QtVersion *version, - const QString &buildDir) -{ - if (m_proFilePath.isEmpty()) - return qMakePair(QIcon(), QString()); - - const ProjectExplorer::TaskHub *taskHub = ExtensionSystem::PluginManager::instance() - ->getObject<ProjectExplorer::TaskHub>(); - QTC_ASSERT(taskHub, return qMakePair(QIcon(), QString())); - - QList<ProjectExplorer::Task> issues = version->reportIssues(m_proFilePath, buildDir); - - QString text; - QIcon icon; - foreach (const ProjectExplorer::Task &t, issues) { - if (!text.isEmpty()) - text.append(QLatin1String("<br>")); - // set severity: - QString severity; - if (t.type == ProjectExplorer::Task::Error) { - icon = taskHub->taskTypeIcon(t.type); - severity = tr("<b>Error:</b> ", "Severity is Task::Error"); - } else if (t.type == ProjectExplorer::Task::Warning) { - if (icon.isNull()) - icon = taskHub->taskTypeIcon(t.type); - severity = tr("<b>Warning:</b> ", "Severity is Task::Warning"); - } - text.append(severity + t.description); - } - if (!text.isEmpty()) - text = QLatin1String("<nobr>") + text; - return qMakePair(icon, text); -} - -void TargetSetupPage::updateVersionItem(QTreeWidgetItem *versionItem, int index) -{ - ImportInfo &info = m_infos[index]; - QPair<QIcon, QString> issues = reportIssues(info.version, info.directory); - - //: We are going to build debug and release - QString buildType = tr("debug and release"); - if ((info.buildConfig & QtVersion::BuildAll) == 0) { - if (info.buildConfig & QtVersion::DebugBuild) - //: Debug build - buildType = tr("debug"); - else - //: release build - buildType = tr("release"); - } - - QString toolTip = info.version->displayName(); - //: %1: qmake used (incl. full path), %2: "debug", "release" or "debug and release" - toolTip.append(tr("<br>using %1 (%2)"). - arg(QDir::toNativeSeparators(info.version->qmakeCommand())). - arg(buildType)); - if (!issues.second.isEmpty()) - toolTip.append(QString::fromLatin1("<br><br>%1").arg(issues.second)); - - // Column 0: - versionItem->setToolTip(NAME_COLUMN, toolTip); - versionItem->setIcon(NAME_COLUMN, issues.first); - versionItem->setText(NAME_COLUMN, info.version->displayName() + " " + buildType); - versionItem->setFlags(Qt::ItemIsUserCheckable | Qt::ItemIsEnabled | Qt::ItemIsSelectable); - versionItem->setData(NAME_COLUMN, Qt::UserRole, index); - - // Column 1 (status): - const QString status = info.isExistingBuild ? - //: Is this an import of an existing build or a new one? - tr("Import") : - //: Is this an import of an existing build or a new one? - tr("New"); - versionItem->setText(STATUS_COLUMN, status); - versionItem->setToolTip(STATUS_COLUMN, status); - - // Column 2 (directory): - Q_ASSERT(versionItem->parent()); - versionItem->setText(DIRECTORY_COLUMN, QDir::toNativeSeparators(info.directory)); - versionItem->setToolTip(DIRECTORY_COLUMN, QDir::toNativeSeparators(info.directory)); -} diff --git a/src/plugins/qt4projectmanager/wizards/targetsetuppage.h b/src/plugins/qt4projectmanager/wizards/targetsetuppage.h index 47b9c847b832963785ac16c48d017f507d71587b..d36b8e304bcf60bd9d2c5b2f2c51cb4e6d03d90a 100644 --- a/src/plugins/qt4projectmanager/wizards/targetsetuppage.h +++ b/src/plugins/qt4projectmanager/wizards/targetsetuppage.h @@ -37,20 +37,18 @@ #include "qt4target.h" #include "qtversionmanager.h" -#include <QtCore/QList> -#include <QtCore/QPair> -#include <QtCore/QSet> #include <QtCore/QString> - -#include <QtGui/QIcon> #include <QtGui/QWizard> + QT_BEGIN_NAMESPACE class QLabel; class QMenu; class QPushButton; +class QSpacerItem; class QTreeWidget; class QTreeWidgetItem; +class QVBoxLayout; QT_END_NAMESPACE namespace Qt4ProjectManager { @@ -67,97 +65,48 @@ class TargetSetupPage : public QWizardPage Q_OBJECT public: - struct ImportInfo { - ImportInfo() : - version(0), - isTemporary(false), - buildConfig(QtVersion::QmakeBuildConfig(0)), - isExistingBuild(false) - { - if (version && version->isValid()) - buildConfig = version->defaultBuildConfig(); - } - - ImportInfo(const BuildConfigurationInfo &source) - : version(source.version), - isTemporary(false), - buildConfig(source.buildConfig), - additionalArguments(source.additionalArguments), - directory(source.directory), - isExistingBuild(false) - {} - - ImportInfo(const ImportInfo &other) : - version(other.version), - isTemporary(other.isTemporary), - buildConfig(other.buildConfig), - additionalArguments(other.additionalArguments), - directory(other.directory), - isExistingBuild(other.isExistingBuild) - { } - - QtVersion *version; - bool isTemporary; - QtVersion::QmakeBuildConfigs buildConfig; - QString additionalArguments; - QString directory; - bool isExistingBuild; - }; - explicit TargetSetupPage(QWidget* parent = 0); ~TargetSetupPage(); + /// Initializes the TargetSetupPage + /// \note The import information is gathered in initializePage(), make sure that the right proFilePath is set before void initializePage(); - - void setImportInfos(const QList<ImportInfo> &infos); - QList<ImportInfo> importInfos() const; - - void setImportDirectoryBrowsingEnabled(bool browsing); - void setImportDirectoryBrowsingLocation(const QString &directory); + /// Changes the default set of checked targets. For mobile Symbian, maemo5, simulator is checked + /// For non mobile, destkop is checked + /// call this before \sa initializePage() void setPreferMobile(bool mobile); - - static QList<ImportInfo> importInfosForKnownQtVersions(const QString &proFilePath); - static QList<ImportInfo> filterImportInfos(const QSet<QString> &validTargets, - const QList<ImportInfo> &infos); - - static QList<ImportInfo> scanDefaultProjectDirectories(Qt4Project *project); - static QList<ImportInfo> recursivelyCheckDirectoryForBuild(const QString &directory, - const QString &proFile, int maxdepth = 3); - - bool hasSelection() const; - bool isTargetSelected(const QString &targetid) const; + /// Sets the minimum qt version + /// calls this before \sa initializePage() + void setMinimumQtVersion(const QtVersionNumber &number); + /// Sets whether the TargetSetupPage looks on disk for builds of this project + /// call this before \sa initializePage() + void setImportSearch(bool b); bool isComplete() const; - - bool setupProject(Qt4Project *project); - -public slots: + bool setupProject(Qt4ProjectManager::Qt4Project *project); + bool isTargetSelected(const QString &id) const; void setProFilePath(const QString &dir); - void checkAll(bool checked); - void checkOne(bool, QTreeWidgetItem *); private slots: - void itemWasChanged(); - void checkAllButtonClicked(); - void checkAllTriggered(); - void uncheckAllTriggered(); - void checkOneTriggered(); - void addShadowBuildLocation(); - void contextMenuRequested(const QPoint & pos); + void newImportBuildConfiguration(const BuildConfigurationInfo &info); private: - void resetInfos(); - QPair<QIcon, QString> reportIssues(QtVersion *version, const QString &buildDir); - void updateVersionItem(QTreeWidgetItem *, int); + void setupImportInfos(); + void cleanupImportInfos(); + void setupWidgets(); + void deleteWidgets(); - QList<ImportInfo> m_infos; bool m_preferMobile; - bool m_toggleWillCheck; + bool m_importSearch; + QtVersionNumber m_minimumQtVersionNumber; QString m_proFilePath; QString m_defaultShadowBuildLocation; + QMap<QString, Qt4TargetSetupWidget *> m_widgets; + QHash<Qt4TargetSetupWidget *, Qt4BaseTargetFactory *> m_factories; + QVBoxLayout *m_layout; + QSpacerItem *m_spacer; Ui::TargetSetupPage *m_ui; - - QMenu *m_contextMenu; + QList<BuildConfigurationInfo> m_importInfos; }; } // namespace Internal diff --git a/src/plugins/qt4projectmanager/wizards/targetsetuppage.ui b/src/plugins/qt4projectmanager/wizards/targetsetuppage.ui index 4acbc47318401d91f27593917b438ead54d1d612..033c8ea4456b54a78bb541489757f36eaa8610f9 100644 --- a/src/plugins/qt4projectmanager/wizards/targetsetuppage.ui +++ b/src/plugins/qt4projectmanager/wizards/targetsetuppage.ui @@ -51,67 +51,26 @@ </property> </spacer> </item> - <item> - <widget class="QPushButton" name="uncheckButton"> - <property name="toolTip"> - <string>Uncheck all Qt versions</string> - </property> - <property name="text"> - <string>Uncheck All</string> - </property> - </widget> - </item> </layout> </item> <item> - <widget class="QTreeWidget" name="versionTree"> - <property name="columnCount"> - <number>3</number> + <widget class="QScrollArea" name="scrollArea"> + <property name="widgetResizable"> + <bool>true</bool> </property> - <column> - <property name="text"> - <string>Qt Version</string> - </property> - </column> - <column> - <property name="text"> - <string>Status</string> + <widget class="QWidget" name="scrollAreaWidgetContents"> + <property name="geometry"> + <rect> + <x>0</x> + <y>0</y> + <width>541</width> + <height>415</height> + </rect> </property> - </column> - <column> - <property name="text"> - <string>Build Directory</string> - </property> - </column> + <layout class="QVBoxLayout" name="verticalLayout_2"/> + </widget> </widget> </item> - <item> - <layout class="QHBoxLayout" name="horizontalLayout"> - <item> - <widget class="QPushButton" name="importButton"> - <property name="text"> - <string>Import Existing Shadow Build...</string> - </property> - <property name="flat"> - <bool>false</bool> - </property> - </widget> - </item> - <item> - <spacer name="horizontalSpacer"> - <property name="orientation"> - <enum>Qt::Horizontal</enum> - </property> - <property name="sizeHint" stdset="0"> - <size> - <width>40</width> - <height>0</height> - </size> - </property> - </spacer> - </item> - </layout> - </item> </layout> </widget> <resources/>